11

データベース行が次のような場合:country = 'usa'クエリを実行"select * from data where country = 'usa '"すると、この行も返されます。したがって、完全一致ではありません。

なぜMySQLはこれを行うのですか? また、実際には真ではない場合に TRUE を返す他のケースは何ですか?

4

5 に答える 5

12

マニュアルに記載されているように:

すべての MySQL 照合はタイプPADSPACEです。これは、MySQL のすべてのCHARと のVARCHAR値が末尾のスペースに関係なく比較されることを意味します。

LIKE演算子の定義では、次のように述べています。

CHAR特に、末尾のスペースは重要です。これは、または演算子VARCHARで実行される比較には当てはまりません。=

この回答で述べたように:

この動作は、SQL-92 および SQL:2008 で指定されています。比較のために、短い文字列は長い文字列の長さに合わせてパディングされます。

ドラフトから (8.2 <比較述語>):

X の文字数の長さが Y の文字数と等しくない場合、短い文字列は比較のために、連結によって長い文字列の長さに拡張されたそれ自体のコピーで効果的に置き換えられます。 1 つ以上のパッド文字の右側。パッド文字は CS に基づいて選択されます。CS に NO PAD 特性がある場合、埋め込み文字は、CS のどの文字列よりも照合が少ない X および Y の文字セット内の文字とは異なる、実装依存の文字です。それ以外の場合、埋め込み文字は <スペース> です。

他の優れたソリューションに加えて:

select binary 'a' = 'a   '
于 2012-05-08T09:16:11.443 に答える
6

char列のタイプがorの場合、末尾のスペースは省略されvarcharます。を使用like 'usa 'すると問題が解決します

于 2012-05-08T09:11:40.230 に答える
1

likeまたはこれで試してみてください

country = 'usa ' AND LENGTH(country) = LENGTH('usa ')
于 2012-05-08T09:12:48.937 に答える
0

マニュアルには次のように書かれています。

すべての MySQL 照合は PADSPACE 型です。これは、MySQL のすべての CHAR 値と VARCHAR 値が末尾のスペースに関係なく比較されることを意味します [...] これはすべての MySQL バージョンに当てはまり、サーバー SQL モードの影響を受けません。

http://dev.mysql.com/doc/refman/5.5/en/char.html

空白を考慮する必要がある場合は、基本的に言語認識ソートを取り除く必要があります。簡単な方法は、バイナリ照合を強制することです。実行して比較してください:

SELECT 'ab'='ab ', BINARY 'ab'='ab '
于 2012-05-08T09:19:16.013 に答える
0

列が char または varchar 型の場合、末尾のスペースは省略されます。

次のリンクで詳細を読むことができます:

http://blogs.agilefaqs.com/2011/06/22/trailing-white-spaces-are-ignored-by-mysql-for-comparison-in-a-select-statement/

于 2012-05-08T09:17:52.130 に答える