如何在 MySQL 中强制执行唯一字段,同时保留尾随空格?

Susan Sarandon
发布: 2024-11-03 09:38:02
原创
1041 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板