相似字符的唯一约束违规
Unique constraint violation on similar characters
我对 MariaDB 中的主键有疑问(我希望 MySQL 也一样)。我正在构建一个 Django 应用程序,其中一些重要的 tables 是由 Django 使用以下 SQL:
创建的
CREATE TABLE table_name
(
term VARCHAR(64) NOT NULL PRIMARY KEY,
enabled TINYINT(1) NOT NULL,
added DATE NOT NULL,
verified DATE NOT NULL
) ENGINE = InnoDB;
如果我在此 table 中插入两行,其中第一行 term
是 ó
,另一行是 o
,我得到错误 [23000][1062] Duplicate entry 'o' for key 'PRIMARY'
。其他类似字母也会出现相同的行为,例如 e
和 é
。
我真的觉得这种行为很奇怪,因为 SQLite.
没有问题
所以现在的问题是:如何让数据库引擎将它们视为不同的值?
额外问题:我可以期望 Postgre 有同样的行为吗SQL?
我 在 SQL 中尝试过这个,而不仅仅是 Django。
好吧,正好我在写的时候自己回答了这个问题。我意识到我没有尝试过字符集 utf8mb4
和排序规则 utf8mb4_bin
的组合,我记得 _bin
排序规则在二进制级别比较字符,没有任何规则使相似的角色看起来很相似。所以用
创建我的数据库
CREATE DATABASE [database_name] CHARACTER SET = 'utf8mb4' COLLATE = 'utf8mb4_bin';
成功了。或者我可以用
创建每个 table
CREATE TABLE [table_name] CHARACTER SET = 'utf8mb4' COLLATE = 'utf8mb4_bin';
,但在数据库中设置它是这里唯一可行的选项,因为 Django 负责 table 创建。
更新:
关于奖金问题,简短的回答是:否。
有关详细信息,请参阅下面的 nick-barnes 评论。
更新二:
Microsoft SQL 服务器(在 SQL Server 2017 CU3 上测试)使用排序规则比较字符串是否相等,因此需要使用二进制排序规则,例如 Latin1_General_BIN
解决此服务器上的这个问题。
我对 MariaDB 中的主键有疑问(我希望 MySQL 也一样)。我正在构建一个 Django 应用程序,其中一些重要的 tables 是由 Django 使用以下 SQL:
创建的CREATE TABLE table_name
(
term VARCHAR(64) NOT NULL PRIMARY KEY,
enabled TINYINT(1) NOT NULL,
added DATE NOT NULL,
verified DATE NOT NULL
) ENGINE = InnoDB;
如果我在此 table 中插入两行,其中第一行 term
是 ó
,另一行是 o
,我得到错误 [23000][1062] Duplicate entry 'o' for key 'PRIMARY'
。其他类似字母也会出现相同的行为,例如 e
和 é
。
我真的觉得这种行为很奇怪,因为 SQLite.
所以现在的问题是:如何让数据库引擎将它们视为不同的值?
额外问题:我可以期望 Postgre 有同样的行为吗SQL?
我 在 SQL 中尝试过这个,而不仅仅是 Django。
好吧,正好我在写的时候自己回答了这个问题。我意识到我没有尝试过字符集 utf8mb4
和排序规则 utf8mb4_bin
的组合,我记得 _bin
排序规则在二进制级别比较字符,没有任何规则使相似的角色看起来很相似。所以用
CREATE DATABASE [database_name] CHARACTER SET = 'utf8mb4' COLLATE = 'utf8mb4_bin';
成功了。或者我可以用
创建每个 tableCREATE TABLE [table_name] CHARACTER SET = 'utf8mb4' COLLATE = 'utf8mb4_bin';
,但在数据库中设置它是这里唯一可行的选项,因为 Django 负责 table 创建。
更新:
关于奖金问题,简短的回答是:否。
有关详细信息,请参阅下面的 nick-barnes 评论。
更新二:
Microsoft SQL 服务器(在 SQL Server 2017 CU3 上测试)使用排序规则比较字符串是否相等,因此需要使用二进制排序规则,例如 Latin1_General_BIN
解决此服务器上的这个问题。