相似字符的唯一约束违规

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解决此服务器上的这个问题。