2016-06-16 21 views
13

Sto provando a selezionare tutte le stringhe nel mio database che inizia con una lettera minuscola con regexp, ma per qualche motivo seleziona tutte le stringhe che iniziano anche con una lettera maiuscola . Che cosa sto facendo di sbagliato?Selezione di tutte le stringhe dal database che inizia con una lettera minuscola

SELECT * 
FROM `allData` 
WHERE response REGEXP '^[a-z]' 
LIMIT 0 , 30 
+3

Come per le [doc] (http://dev.mysql.com/doc/refman/5.7/en/regexp.html): 'REGEXP non è case sensitive, tranne quando viene utilizzato con stringhe binarie. ' –

risposta

11

Dal MySQL REGEXP manual:

REGEXP non è case sensitive, tranne quando viene utilizzato con stringhe binarie.

È possono quindi avere un po 'di fortuna quando si utilizza una stringa binaria, invece:

WHERE response REGEXP BINARY '^[a-z]' 

Ragionevolmente sciocco violino per la dimostrazione: http://sqlfiddle.com/#!9/7eade/3

EDIT: Come Ray dice nei commenti, si dovrebbe probabilmente usare [[:lower:]] invece per lavorare su tutte le regole di confronto, ad es

WHERE response REGEXP BINARY '^[[:lower:]]' 
+0

Grazie. Questo funziona perfettamente. – frosty

+0

Se questo ha funzionato per te, contrassegnare come accettato quando è possibile :) – slugonamission

+0

Non pensi che [[: lower:]] 'sia più generale di' [a-z] 'attraverso set di caratteri e regole di confronto? – Ray

1
SELECT * 
FROM allData 
WHERE LOWER(LEFT(response, 1)) <> LEFT(response, 1) 
LIMIT 0 , 30 

... tuttavia, questo può essere limitato dalla vostra MySQL character collation

2

userei personaggio di mysql Nome classe per abbinare in concomitanza con REGEXP BINARY:

WHERE response REGEXP BINARY '^[[:lower:]]' 

I don' so se [a-z] ha senso in ogni set di caratteri e regole di confronto, dove come il nome della classe di personaggio [:lower:] corrisponderà sempre a tutti i bassi er caso caratteri alfa.

0
select * from alldata where lower(left(response,1)) COLLATE Latin1_General_CS_AS =left(response,1) and response is not null and response<>''