2016-06-16 5 views
13

私のデータベースで、regexpで小文字で始まる文字列をすべて選択しようとしていますが、何らかの理由で大文字で始まる文字列もすべて選択しています。私は間違って何をしていますか? MySQL REGEXP manualから小文字で始まるデータベースからすべての文字列を選択する

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

(http://dev.mysql.com/doc/refman/5.7/en/regexp.html): 'REGEXPは、バイナリ文字列を使用する場合を除き、大文字と小文字は区別されません。 ' –

答えて

11

REGEXPは、バイナリ文字列を使用する場合を除き、大文字と小文字の区別はありません。

あなたは代わりに、バイナリ文字列を使用しているときしたがって、いくつかの運を持っていることがあります。

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

実証のための合理的に愚かなフィドル:http://sqlfiddle.com/#!9/7eade/3

EDIT:レイがコメントで言うように、あなたがすべきをおそらく、すべての照合を処理するために、代わりに[[:lower:]]を使用してください。

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

ありがとう。これは完全に機能します。 – frosty

+0

これがうまくいく場合は、受け入れ可能とマークしてください:) – slugonamission

+0

文字セットと照合の間で '[[:lower:]]'が '[a-z] 'よりも一般的ではないと思いませんか? – Ray

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

は...しかし、これは私がREGEXP BINARYと一緒に一致させるために、MySQLの文字クラス名を使用することになり、あなたのMySQL character collation

2

によって制限されることがあります。

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

私はドン」文字クラス名[:lower:]が常にすべての低値に一致する場合、[a-z]がすべての文字セットと照合で意味を持つかどうかを知る大文字アルファベット文字。 [ドキュメント] 1として

0
select * from alldata where lower(left(response,1)) COLLATE Latin1_General_CS_AS =left(response,1) and response is not null and response<>'' 
関連する問題