具有唯一字段的 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中文网其他相关文章!