用戶註冊時誤輸入全角字符(如全角手機號),導致短信發送失敗。本文提供從問題排查、數據清洗到通用轉換函數的完整解決方案。
REPLACE 將全角數字轉半角,分組統計重複記錄。MOBILE 與 USER_NAME 字段同步執行 10 層 REPLACE 替換全角數字 0-9 為 0-9。針對上述硬編碼方式不靈活,封裝通用函數 func_convert(str, flag):
flag=0:全角→半角(Unicode -65248,匹配範圍 !-~)。flag=1:半角→全角(Unicode +65248,匹配範圍 !-~)。 (U+3000)↔ 半角空格 (U+0020)。DELIMITER $$
CREATE FUNCTION `func_convert`(p_str VARCHAR(200), flag INT)
RETURNS VARCHAR(200)
BEGIN
DECLARE pat VARCHAR(8);
DECLARE step INT;
DECLARE i INT;
DECLARE str VARCHAR(200);
SET str = p_str;
IF flag = 0 THEN
SET pat = N'%[!-~]%';
SET step = -65248;
SET str = REPLACE(str, N' ', N' ');
ELSE
SET pat = N'%[!-~]%';
SET step = 65248;
SET str = REPLACE(str, N' ', N' ');
END IF;
SET i = LOCATE(pat, str);
WHILE i > 0 DO
SET str = REPLACE(str, SUBSTRING(str, i, 1), CHAR(UNICODE(SUBSTRING(str, i, 1)) + step));
SET i = LOCATE(pat, str);
END WHILE;
RETURN str;
END $$
DELIMITER ;
文中亦提供 T-SQL 版 u_convert,使用 PATINDEX + COLLATE LATIN1_GENERAL_BIN 實現二進制匹配,邏輯一致。
掌握 Unicode 碼位偏移規律(基本拉丁字母與全角形式相差 65248),即可靈活擴展至其他字符集轉換場景。