具有唯一欄位的 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中文網其他相關文章!