首頁 >資料庫 >mysql教程 >如何在 MySQL 中強制執行唯一字段,同時保留尾隨空格?

如何在 MySQL 中強制執行唯一字段,同時保留尾隨空格?

Susan Sarandon
Susan Sarandon原創
2024-11-03 09:38:021078瀏覽

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」左邊,它將按預期儲存。但是,如果您嘗試在右側插入帶有空格的單詞,它會在儲存之前修剪掉尾部空格。

潛在的解決方案

一種潛在的解決方案就是在空格後的單字右側添加一個特殊字元。然而,這種方法會帶來額外的複雜性,並且可能並不總是實用。

建議的解決方案

更好的解決方案是利用 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn