終了スペースを無視する固有のフィールドを持つ MySQL データベース
MySQL データベースは、文字列を比較するときにデフォルトで末尾の空白を無視します。これは、スペースを考慮する必要がある一意のフィールドがある場合に問題になる可能性があります。
次のテーブル定義を考えてください:
<code class="sql">CREATE TABLE strings ( id bigint(20) unsigned NOT NULL AUTO_INCREMENT, string varchar(255) COLLATE utf8_bin NOT NULL, created_ts timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY string (string) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;</code>
スペースを含む単語 'apple' を挿入しようとすると、左の場合、期待どおりに保存されます。ただし、右側にスペースを含む単語を挿入しようとすると、保存する前に末尾のスペースが削除されます。
解決策の候補
解決策の 1 つ単語の右側のスペースの後に特殊文字を追加することです。ただし、このアプローチではさらに複雑さが増し、常に実用的であるとは限りません。
提案された解決策
より良い解決策は、MySQL 8.0 で導入された MySQL の NO PAD 照合順序を利用することです。 。 NO PAD タイプの照合順序は、文字列を比較するときに末尾の空白を無視しません。
NO PAD 照合順序を使用してテーブルを作成するには、次の構文を使用します。
<code class="sql">CREATE TABLE test_ws ( `value` VARBINARY(255) UNIQUE ) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;</code>
この照合順序を使用すると、次のことができます。末尾に空白がある場合とない場合の値の挿入:
<code class="sql">INSERT INTO test_ws (`value`) VALUES ('a'); -- Inserts "a" INSERT INTO test_ws (`value`) VALUES ('a '); -- Inserts "a " SELECT CONCAT('(', `value`, ')') FROM test_ws; -- Output: -- (a) -- (a )</code>
このアプローチは、末尾の空白を無視する一意のフィールドの問題に対処しますが、そのような列での並べ替えはバイト値で行われ、整列しない可能性があることに注意することが重要です。ユーザーの期待を込めて。
以上が末尾のスペースを保持しながら MySQL で一意のフィールドを強制するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。