資料驗證常需在 SQL 層面判斷「是否為漢字」、「日期格式是否合法」、「是否為純數字」。以下提供三個可直接部署的 MySQL 函數,回傳 1=符合、0=不符合。
DROP FUNCTION IF EXISTS fc_is_hanzi;
CREATE FUNCTION fc_is_hanzi(p_str VARCHAR(1024))
RETURNS INT
DETERMINISTIC
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE other_cnt INT DEFAULT 0;
DECLARE acode INT;
WHILE i <= CHAR_LENGTH(p_str) DO
SET acode = ASCII(SUBSTRING(p_str, i, 1));
-- GBK/Big5 雙位元組高位元範圍 124-254 (視字元集而定)
IF acode < 124 OR acode > 254 THEN
SET other_cnt = other_cnt + 1;
END IF;
SET i = i + 1;
END WHILE;
RETURN IF(other_cnt = 0, 1, 0);
END;
測試:SELECT fc_is_hanzi('中文測試'); -- 1 / SELECT fc_is_hanzi('Test123'); -- 0
DROP FUNCTION IF EXISTS fc_ck_date;
CREATE FUNCTION fc_ck_date(p_cont CHAR(32))
RETURNS TINYINT
DETERMINISTIC
BEGIN
-- DATE_FORMAT 若解析失敗回傳 NULL
RETURN IF(DATE_FORMAT(p_cont, '%Y%m%d') IS NULL, 0, 1);
END;
測試:SELECT fc_ck_date('2023-12-25'); -- 1 / SELECT fc_ck_date('2023-13-01'); -- 0
DROP FUNCTION IF EXISTS fc_is_num;
CREATE FUNCTION fc_is_num(p_string VARCHAR(32))
RETURNS INT
DETERMINISTIC
BEGIN
DECLARE res INT;
SELECT p_string REGEXP '^[0-9]*$' INTO res;
RETURN res;
END;
測試:SELECT fc_is_num('12345'); -- 1 / SELECT fc_is_num('12a45'); -- 0
CREATE ROUTINE 權限。DETERMINISTIC,查詢快取可生效。REGEXP '[\\x{4e00}-\\x{9fff}]' (需 MySQL 8.0+)。