我正在尝试创建一个验证MySQL中用户名的函数:
FUNCTION `player_name_is_valid`(name TEXT CHARACTER SET utf8) RETURNS int(11)
BEGIN
declare result tinyint(1) DEFAULT 1;
declare reg tinyint(1) DEFAULT 1;
IF(CHAR_LENGTH(name) > 16 OR CHAR_LENGTH(name) < 3) THEN
SET result = 0; #name cannot exceed 16 characters, cannot be less than 3
END IF;
SELECT name REGEXP '^[a-z0-9_-]$' INTO reg;
if(reg = -) THEN
SET result = 0;
END IF;
RETURN result;
END
但是,正则表达式部分失败。无论怎样,它都返回0。我测试的是“你好”#39;它返回0,地狱!0&#39;它也返回0。
可能出现什么问题?
答案 0 :(得分:2)
MySQL的REGEX只执行模式匹配但无法捕获。它将始终返回0或1.
此外,来自doc:
警告REGEXP和RLIKE运算符以字节方式工作,因此 它们不是多字节安全的,可能会产生意想不到的结果 多字节字符集。 此外,这些运营商进行了比较 字节值和重音字符的字符可能不会 即使给定的排序规则将它们视为相等,也要比较相等。
答案 1 :(得分:0)
从记录上看,MySQL从那时起就共同行动了……
MySQL使用Unicode国际组件(ICU)实现了正则表达式支持,该组件提供了完整的Unicode支持并且是多字节安全的。 (在MySQL 8.0.4之前,MySQL使用Henry Spencer的正则表达式实现,该实现以字节方式运行,并且不是多字节安全的。