web-dev-qa-db-ja.com

MySQLは先頭または末尾の空白を含むフィールドを選択します

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

UPDATE Foo SET field = TRIM(field);

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

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

これは動作するはずですが、動作しないようです。

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

23
Michael Irey

に記載されているCHARおよびVARCHARタイプ

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

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))
46
eggyal
SELECT *
FROM 
    `foo`
WHERE 
   (name LIKE ' %')
OR 
   (name LIKE '% ')
29
user4035

RegEx の例を次に示します

SELECT *
FROM 
    `foo`
WHERE 
   (name REGEXP '(^[[:space:]]|[[:space:]]$)')
1
EpixRu