33

MySQL メソッドを使用して、TRIM()先頭または末尾の空白を含むフィールドを次のようにクリーンアップできますUPDATE

UPDATE Foo SET field = TRIM(field);

これが実行される前に、これが影響を与えるフィールドを実際に確認したいと思います。私はこれを試しましたが、0の結果を返します:

SELECT * FROM Foo WHERE field != TRIM(field);

これは機能するはずですが、機能しません。

誰にも解決策がありますか?また、なぜこれが機能しないのか不思議です...

4

4 に答える 4

59

TheCHARおよび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 の文字セット内の文字とは異なる、実装依存の文字です。それ以外の場合、埋め込み文字は <スペース> です。

1 つの解決策:

SELECT * FROM Foo WHERE CHAR_LENGTH(field) != CHAR_LENGTH(TRIM(field))
于 2013-05-23T22:02:13.010 に答える
36
SELECT *
FROM 
    `foo`
WHERE 
   (name LIKE ' %')
OR 
   (name LIKE '% ')
于 2013-05-23T21:59:21.057 に答える