0

MySQL ステートメント

mysql> select * from field where dflt=' '

空の値に一致するように見えます。ステートメントとは異なります

mysql> select * from field where concat('_',dflt,'_') = '_ _';

MySQL リファレンスでこの動作の説明を見つけることができませんでした。MySQL に入力を文字どおりに解釈させるにはどうすればよいですか?

EDITED: これは実際には NULL 値には一致しませんが、空の値には一致します。

4

2 に答える 2

2

The CHARand VARCHARTypesで述べたように:

すべての 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-08-27T00:40:11.597 に答える
1

ドキュメントは見つかりませんでしたが、テキスト比較を行うときに末尾のスペースが無視されることは広く知られています。

リテラルマッチを強制するには、これを試してください:

select *
from field
where dflt = ' '
and length(dflt) = 1; // length does not ignore trailing spaces
于 2012-08-27T00:40:01.610 に答える