【发布时间】:2013-05-09 15:59:00
【问题描述】:
我想检查一个字符串是否只包含大写字母。我知道 RLIKE/REGEXP 在 MySQL 中不区分大小写。所以我尝试使用:upper: 字符类:
SELECT 'z' REGEXP '^[[:upper:]]+$';
虽然 z 是小写的,但这是真的,...为什么?
【问题讨论】:
我想检查一个字符串是否只包含大写字母。我知道 RLIKE/REGEXP 在 MySQL 中不区分大小写。所以我尝试使用:upper: 字符类:
SELECT 'z' REGEXP '^[[:upper:]]+$';
虽然 z 是小写的,但这是真的,...为什么?
【问题讨论】:
REGEXP 不区分大小写,除非与二进制字符串一起使用。
因此,考虑到这一点,只需执行以下操作:
SELECT * FROM `users` WHERE `email` REGEXP BINARY '[A-Z]';
使用上面的示例,您将获得包含一个或多个大写字母的电子邮件列表。
【讨论】:
对我来说,这是可行的,并且不使用正则表达式。它基本上将字段与mysql本身大写的自身进行比较。
-- will detect all names that are not in uppercase
SELECT
name, UPPER(name)
FROM table
WHERE
BINARY name <> BINARY UPPER(name)
;
【讨论】:
LOWER 答案中的UPPER。
更改为区分大小写的排序规则,例如。
CHARACTER SET latin1 COLLATE latin1_general_cs
然后试试这个查询,
SELECT 'z' REGEXP '^[A-Z]+$'
【讨论】:
A-Z 的作用相同时添加:upper:,而当排序规则为*_ci 时,:upper: 与:lower: 相同?我以为*_ci 给出了默认值,但是当使用:upper: 时,它会查找大写字母。在dev.mysql.com/doc/refman/5.0/en/regexp.html 上[:character_class:] 的描述中说我应该看ctype(3) 的手册页。我试过help ctype,man ctype,...没有任何效果
SELECT 'z' RLIKE '^[A-Z]$' COLLATE 'utf8_general_cs';,这给了我一个错误:ERROR 1273 (HY000): Unknown collation: 'utf8_general_cs'。命令SELECT 'z' RLIKE '^[A-Z]$' COLLATE 'utf8_general_ci'; 工作正常。那么如何安装区分大小写的排序规则?
SELECT CONVERT(_utf8'z' USING 'latin1') RLIKE CONVERT(_utf8'[[:upper:]]' USING 'latin1') COLLATE 'latin1_general_cs'; 这真的是向 MySQL 引入区分大小写的唯一方法吗?
SELECT * FROM table where column = upper(column);