Как проверить заглавные буквы в MySQL?

Я хочу проверить, состоит ли строка только из заглавных букв. Я знаю, что RLIKE/REGEXP не чувствительны к регистру в MySQL. Поэтому я попытался использовать класс символов :upper::

SELECT 'z' REGEXP '^[[:upper:]]+$';

Это дает true, хотя z в нижнем регистре... почему?


person R_User    schedule 15.05.2013    source источник


Ответы (3)


REGEXP не чувствителен к регистру, за исключением случаев, когда он используется с двоичными строками.

http://dev.mysql.com/doc/refman/5.7/en/regexp.html

Итак, имея это в виду, просто сделайте что-то вроде этого:

SELECT * FROM `users` WHERE `email` REGEXP BINARY '[A-Z]';

Используя приведенный выше пример, вы получите список электронных писем, содержащих одну или несколько заглавных букв.

person Kyle Anderson    schedule 22.09.2015

Для меня это работает и не использует регулярное выражение. Он в основном сравнивает поле с самим собой в верхнем регистре самим mysql.

-- will detect all names that are not in uppercase
SELECT 
    name, UPPER(name) 
FROM table 
WHERE 
    BINARY name <> BINARY UPPER(name)
;
person Elzo Valugi    schedule 02.05.2016
comment
Это решило для меня, просто хотел проверить, есть ли ЛЮБАЯ заглавная буква в моих значениях столбца. Заменил UPPER в ответе на LOWER. - person Maximiliano Guerra; 30.10.2018
comment
Чтобы объяснить, почему это работает, сравнение строк в MySQL нечувствительно к регистру. Это означает, что слова «XYZ» и «xyz» считаются равными при сравнении. Если мы сравниваем с использованием BINARY, сравниваются точные символы. - person Praveen E; 19.01.2021

изменить на сортировку с учетом регистра, например.

CHARACTER SET latin1 COLLATE latin1_general_cs

затем попробуйте этот запрос,

SELECT 'z' REGEXP '^[A-Z]+$'
person John Woo    schedule 15.05.2013
comment
+1 была такая же идея, но не знал трюка с набором символов latin1 - person Stephan; 15.05.2013
comment
Итак, но почему класс персонажа не работает? Потому что я использую неправильную сортировку? зачем добавлять :upper:, когда A-Z делает то же самое, а :upper: совпадает с :lower:, когда сопоставление *_ci? Я думал, что *_ci дает ошибку, но при использовании :upper: он ищет буквы в верхнем регистре. В описании [:character_class:] на dev.mysql.com/ doc/refman/5.0/en/regexp.html Там написано, что мне следует просмотреть страницы руководства ctype(3). Пробовал help ctype, man ctype,... ничего не получилось - person R_User; 15.05.2013
comment
Я попробовал: 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'; работает нормально. Итак, как я могу установить сортировку с учетом регистра? - person R_User; 15.05.2013
comment
Нашел решение ошибки: SELECT CONVERT(_utf8'z' USING 'latin1') RLIKE CONVERT(_utf8'[[:upper:]]' USING 'latin1') COLLATE 'latin1_general_cs'; Действительно ли это единственный способ ввести учет регистра в MySQL? - person R_User; 15.05.2013
comment
Как насчет этого, без регулярного выражения. SELECT * FROM table where column = upper(column); - person Noel; 15.05.2013