2013-05-15 4 views
5

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

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

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

ответ

4

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

CHARACTER SET latin1 COLLATE latin1_general_cs 

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

SELECT 'z' REGEXP '^[A-Z]+$' 
+0

+1 была такая же идея, но не знала, трюк с latin1 набора символов – Stephan

+0

Так, но почему класс персонажа не работает? Потому что я использую неправильную сортировку? почему добавление ': upper:' когда 'A-Z' делает то же самое, а': upper: 'совпадает с': lower: 'когда сортировка' * _ci'? Я думал, что '* _ci' дает dafault, но при использовании': upper: 'он ищет буквы в верхнем регистре. В описании [: character_class:] на http://dev.mysql.com/doc/refman/5.0/en/regexp.html В нем говорится, что я должен посмотреть страницы руководства 'ctype (3)'. Я попробовал 'help ctype',' man ctype', ... ничего не работало –

+0

Я попытался: 'SELECT 'z' RLIKE '^ [AZ] $' COLLATE 'utf8_general_cs';', который дал мне ошибку: 'ERROR 1273 (HY000): Неизвестная сортировка: 'utf8_general_cs''. Команда 'SELECT 'z' RLIKE '^ [A-Z] $' COLLATE 'utf8_general_ci';' отлично работает. Итак, как я могу установить чувствительную к регистру сортировку? –

13

REGEXP is not case sensitive, except when used with binary strings.

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

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

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

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

2

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

-- will detect all names that are not in uppercase 
SELECT 
    name, UPPER(name) 
FROM table 
WHERE 
    BINARY name <> BINARY UPPER(name) 
; 
+0

Это хорошее аккуратное решение, спасибо. –

Смежные вопросы