問題:
MySQL データベースでは、一意のフィールドは次のことを保証する必要があります。 2 つの行が同じ値を持つことはありません。ただし、末尾に空白があるデータを一意のフィールドに挿入すると、空白は無視されるため、重複した値が格納される可能性があります。これは、ユーザー入力の先頭と末尾の空白を保持する必要がある場合に問題を引き起こします。
解決策:
根本的な問題は、文字列比較における末尾の空白の MySQL の処理に起因します。 。すべての MySQL 照合順序は PADSPACE 型です。これは、CHAR フィールドと VARCHAR フィールドの両方で末尾のスペースが無視されることを意味します。この動作は、一貫した文字列比較を保証することを目的としていますが、末尾の空白を保持する必要性と矛盾します。
この問題を解決するには、主に 2 つの解決策があります。
1.データを VARBINARY として保存する:
CHAR や VARCHAR などのテキストベースのデータ型を使用する代わりに、データを VARBINARY として保存することを検討してください。 VARBINARY はデータをバイトのシーケンスとして格納し、末尾の空白を含むすべての文字を保持します。これにより、一意のフィールドが空白を含む正確な値に基づいて確実に一意性を実現します。
例:
<code class="sql">CREATE TABLE test_ws ( `value` VARBINARY(255) UNIQUE );</code>
2. NO PAD 照合を使用する (MySQL 8.0 以降):
MySQL バージョン 8.0 以降では、NO PAD 照合が導入されました。これらの照合順序では、文字列比較中に末尾の空白を含む埋め込み文字が無視されます。 NO PAD 照合を使用すると、末尾の空白を含む正確な値に基づいて一意性を強制できます。
例:
<code class="sql">CREATE TABLE test_ws ( `value` VARCHAR(255) UNIQUE COLLATE utf8mb4_0900_ai_ci );</code>
注: NO PAD 照合フィールドに基づいてデータを並べ替えると、認識される文字シーケンスではなくバイト値に基づいて並べ替えが行われるため、予期しない結果が生じる可能性があります。
以上がMySQL は固有のフィールドの末尾の空白をどのように処理しますか?またその回避策は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。