MySQL 5.7 函数优化:高效提取手机号

本文将介绍如何优化 MySQL 5.7 中的 getPhone 函数,以提高提取手机号码的效率。该函数旨在从一段文本中提取第一个符合中国大陆手机号码格式的号码。

原始函数

CREATE DEFINER=`ioc`@`%` FUNCTION `getPhone`(f_string varchar(3000) CHARACTER SET utf8mb4) RETURNS varchar(11) CHARSET utf8
BEGIN

DECLARE isPhone INT(1) DEFAULT 0;

DECLARE ipos INT(11) DEFAULT 0;

DECLARE phone VARCHAR(11) DEFAULT '';

DECLARE c_char VARCHAR(1) CHARACTER SET utf8mb4 DEFAULT '';

SELECT f_string REGEXP '[1][35678][0-9]{9}' INTO isPhone;

IF (isPhone=1) THEN

f_loop:LOOP

SELECT SUBSTR(f_string,ipos,1) INTO c_char;

IF (c_char='1') THEN

SELECT SUBSTR(f_string,ipos,11) INTO phone;

SELECT phone REGEXP '[1][35678][0-9]{9}' INTO isPhone;

IF (isPhone=1) THEN

LEAVE f_loop;

ELSE

SET ipos = ipos+11;

END IF;

END IF;

SET ipos = ipos+1;

IF ipos=LENGTH(f_string) THEN

LEAVE f_loop;

END IF;

END LOOP f_loop;

END IF;

RETURN phone;

END

该函数使用循环遍历字符串,逐个字符判断是否为手机号,效率较低。

优化建议

  1. 使用正则表达式替代循环判断: 可以利用 REGEXP_INDEX 函数直接获取第一个匹配的手机号位置,并使用 SUBSTRING 函数提取该号码,从而避免循环判断。
  2. 减少变量使用: 可以直接使用 SELECT REGEXP 判断结果,无需定义 isPhone 变量。
  3. 考虑函数拆分: 对于复杂的功能,可以将函数拆分成多个小函数,提高代码的可读性和可维护性。

优化后的函数

CREATE DEFINER=`ioc`@`%` FUNCTION `getPhone`(f_string varchar(3000) CHARACTER SET utf8mb4) RETURNS varchar(11) CHARSET utf8
BEGIN

    DECLARE phone VARCHAR(11) DEFAULT '';

    SELECT SUBSTRING(f_string, REGEXP_INDEX(f_string, '[1][35678][0-9]{9}'), 11) INTO phone;

    RETURN phone;

END

优化后的函数利用 REGEXP_INDEX 和 SUBSTRING 函数直接提取第一个匹配的手机号,有效提高了效率。

注意: 该优化方案仅适用于中国大陆手机号码格式,如果需要支持其他地区的手机号码格式,需要修改正则表达式。

MySQL 5.7 函数优化:高效提取手机号

原文地址: https://www.cveoy.top/t/topic/ok6w 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录