unicode用户名的RegEx模式?

时间:2014-05-16 16:46:12

标签: mysql regex unicode

我正在尝试创建一个验证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。

可能出现什么问题?

2 个答案:

答案 0 :(得分:2)

MySQL的REGEX只执行模式匹配但无法捕获。它将始终返回0或1.

此外,来自doc:

  

警告REGEXP和RLIKE运算符以字节方式工作,因此   它们不是多字节安全的,可能会产生意想不到的结果   多字节字符集。 此外,这些运营商进行了比较   字节值和重音字符的字符可能不会   即使给定的排序规则将它们视为相等,也要比较相等。

答案 1 :(得分:0)

从记录上看,MySQL从那时起就共同行动了……

  

MySQL使用Unicode国际组件(ICU)实现了正则表达式支持,该组件提供了完整的Unicode支持并且是多字节安全的。 (在MySQL 8.0.4之前,MySQL使用Henry Spencer的正则表达式实现,该实现以字节方式运行,并且不是多字节安全的。

来源:https://dev.mysql.com/doc/refman/8.0/en/regexp.html