データベース行が次のような場合:country = 'usa'
クエリを実行"select * from data where country = 'usa '"
すると、この行も返されます。したがって、完全一致ではありません。
なぜMySQLはこれを行うのですか? また、実際には真ではない場合に TRUE を返す他のケースは何ですか?
データベース行が次のような場合:country = 'usa'
クエリを実行"select * from data where country = 'usa '"
すると、この行も返されます。したがって、完全一致ではありません。
なぜMySQLはこれを行うのですか? また、実際には真ではない場合に TRUE を返す他のケースは何ですか?
マニュアルに記載されているように:
すべての MySQL 照合はタイプ
PADSPACE
です。これは、MySQL のすべてのCHAR
と のVARCHAR
値が末尾のスペースに関係なく比較されることを意味します。
LIKE
演算子の定義では、次のように述べています。
この回答で述べたように:
この動作は、SQL-92 および SQL:2008 で指定されています。比較のために、短い文字列は長い文字列の長さに合わせてパディングされます。
ドラフトから (8.2 <比較述語>):
X の文字数の長さが Y の文字数と等しくない場合、短い文字列は比較のために、連結によって長い文字列の長さに拡張されたそれ自体のコピーで効果的に置き換えられます。 1 つ以上のパッド文字の右側。パッド文字は CS に基づいて選択されます。CS に NO PAD 特性がある場合、埋め込み文字は、CS のどの文字列よりも照合が少ない X および Y の文字セット内の文字とは異なる、実装依存の文字です。それ以外の場合、埋め込み文字は <スペース> です。
他の優れたソリューションに加えて:
select binary 'a' = 'a '
char
列のタイプがorの場合、末尾のスペースは省略されvarchar
ます。を使用like 'usa '
すると問題が解決します
like
またはこれで試してみてください
country = 'usa ' AND LENGTH(country) = LENGTH('usa ')
マニュアルには次のように書かれています。
すべての MySQL 照合は PADSPACE 型です。これは、MySQL のすべての CHAR 値と VARCHAR 値が末尾のスペースに関係なく比較されることを意味します [...] これはすべての MySQL バージョンに当てはまり、サーバー SQL モードの影響を受けません。
http://dev.mysql.com/doc/refman/5.5/en/char.html
空白を考慮する必要がある場合は、基本的に言語認識ソートを取り除く必要があります。簡単な方法は、バイナリ照合を強制することです。実行して比較してください:
SELECT 'ab'='ab ', BINARY 'ab'='ab '
列が char または varchar 型の場合、末尾のスペースは省略されます。
次のリンクで詳細を読むことができます: