2016-01-14 3 views
7

私のバックエンドの問題のトラブルシューティングには2時間かかりました。mysql、スペースは空の文字列に等しい

原因であることが確認された空の文字列のスペースに等しい:

SELECT ' ' = ''; 
-> 1 

SELECT STRCMP(' ', ''); 
-> 0 /* means equal */ 

興味深いことに、

SELECT '' REGEXP '[ ]'; 
-> 0 
SELECT '' REGEXP ' '; 
-> 0 
SELECT ' ' REGEXP ' '; 
-> 1 

私はこれを防ぐことはできますか?それは設定ですか?

答えて

4

これが失敗した理由はここにhttp://dev.mysql.com/doc/refman/5.0/en/char.htmlドキュメントで説明されています。CHARとVARCHAR列の

値が列に割り当てられた文字セットの照合に に従ってソートと比較されます。

すべてのMySQL照合はPADSPACEタイプです。これは、MySQLのすべてのCHAR、 VARCHAR、およびTEXT値が、末尾の空白文字である に関係なく比較されることを意味します。この場合の「比較」には、 LIKEパターンマッチング演算子が含まれていません。後続のスペースは、 となります。この問題を回避する1つの方法はBINARY

SELECT BINARY '' = ' '; 
0 

としてキャストすることです

またLIKEを使用することができます。

SELECT '' LIKE ' '; 
0 
+0

興味深いです。しかし、通常は '' 'と' '''はプレースホルダーですから、私はすべてのクエリで=の代わりにLIKEを使いたいとは思いません... – Sebas

+0

Buなぜ起こっているのですか?なぜ ''と ''が偽でないのですか?私はこのPostgreSQLを試してみましたが、正しい出力は 'False'ですが、MySQLではありません –

+0

@ Code-Monk - 答えに説明を追加しました。 – billynoah

関連する問題