MySQL TRIM()
メソッドを使用して、先頭または末尾の空白を含むフィールドをUPDATE
でクリーンアップできます。
UPDATE Foo SET field = TRIM(field);
これが実行される前に、これが影響するフィールドを実際に見たいです。私はこれを試しましたが、0の結果を返します:
SELECT * FROM Foo WHERE field != TRIM(field);
これは動作するはずですが、動作しないようです。
誰にも解決策がありますか?また、なぜこれが機能しないのか興味があります...
すべてのMySQL照合は
PADSPACE
タイプです。これは、MySQLのすべてのCHAR
とVARCHAR
の値が、末尾のスペースに関係なく比較されることを意味します。
LIKE
演算子の定義では、マニュアルは次のように述べています。
この回答 で述べたように:
この動作は、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))
SELECT *
FROM
`foo`
WHERE
(name LIKE ' %')
OR
(name LIKE '% ')
RegEx の例を次に示します
SELECT *
FROM
`foo`
WHERE
(name REGEXP '(^[[:space:]]|[[:space:]]$)')