末尾のスペースを保持しながら MySQL で一意のフィールドを強制するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-03 09:38:02
オリジナル
1042 人が閲覧しました

How to enforce unique fields in MySQL while preserving trailing spaces?

終了スペースを無視する固有のフィールドを持つ 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート