2013-05-15 15 views
5

我想檢查一下,如果一個字符串只包含大寫字母。我知道在MySQL中RLIKE/REGEXP不區分大小寫。所以我試圖用:upper:字符類:如何檢查MySQL中的大寫字母?

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

這讓真正的,雖然z是在較低的情況下,爲什麼?

回答

4

更改爲區分大小寫的排序規則,例如。

CHARACTER SET latin1 COLLATE latin1_general_cs 

然後嘗試此查詢,

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

+1有同樣的想法,但不知道用LATIN1字符集招那麼 – Stephan

+0

,但爲什麼字符類不行?因爲我使用錯誤的排序規則?爲什麼在'A-Z'確實加了':upper:',當:collat​​ion是'* _ci'時,':upper:'和':lower:'是一樣的?我以爲'* _ci'給出了默認值,但是在使用':upper:'時它會查找大寫字母。在http://dev.mysql.com/doc/refman/5.0/en/regexp.html中對[:character_class:]的描述它說我應該查看'ctype(3)'的手冊頁。我嘗試了'help ctype','man ctype',...沒有任何工作 –

+0

我試過了:'SELECT'z'RLIKE'^ [AZ] $'COLLATE'utf8_general_cs';',這給了我一個錯誤:'錯誤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

這是一個不錯的解決方案,謝謝。 –

相關問題