2013-05-15 16 views
5

Voglio verificare se una stringa contiene solo lettere maiuscole. So che RLIKE/REGEXP non sono case sensitive in MySQL. Così ho cercato di utilizzare la classe :upper: carattere:Come verificare la presenza di lettere maiuscole in MySQL?

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

Questo dà il vero, anche se la z è in minuscolo, ... perché?

risposta

4

passare alla distinzione case sensitive, ad es.

CHARACTER SET latin1 COLLATE latin1_general_cs 

quindi provare questa query,

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

+1 avuto la stessa idea, ma non conosceva il trucco con carattere latin1 set – Stephan

+0

Allora, ma perché la classe di caratteri non funziona? Perché sto usando la collazione sbagliata? perché aggiungere ': upper:' quando 'A-Z' fa lo stesso, e': upper: 'è lo stesso di': lower: 'quando la collation è' * _ci'? Ho pensato che '* _ci' fornisca il dafault, ma quando si usa': upper: 'cerca lettere maiuscole. Nella descrizione di [: character_class:] su http://dev.mysql.com/doc/refman/5.0/en/regexp.html Dice che dovrei guardare le pagine di manuale di 'ctype (3)'. Ho provato 'help ctype',' man ctype', ... niente ha funzionato –

+0

Ho provato: 'SELECT 'z' RLIKE '^ [AZ] $' COLLATE 'utf8_general_cs';', che mi ha dato un errore: 'ERRORE 1273 (HY000): fascicolazione sconosciuta: 'utf8_general_cs''. Il comando 'SELECT 'z' RLIKE '^ [A-Z] $' COLLATE 'utf8_general_ci';' funziona bene. Quindi, come posso installare la fascicolazione case sensitive? –

13

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

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

Quindi, con questo in mente, basta fare qualcosa di simile:

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

Utilizzando l'esempio precedente, otterresti un elenco di e-mail contenenti una o più lettere maiuscole.

2

Per me questo funziona e non utilizza un'espressione regolare. In pratica, confronta il campo con se stesso sovrascritto da mysql stesso.

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

Questa è una bella soluzione, grazie. –