在下表中,使用mariadb-server-10.1 10.1.32+maria-1~信任:
CREATE TABLE `tags` (
`tag_name` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL,
`thing_id` int(11) NOT NULL,
PRIMARY KEY (`thing_id`,`tag_name`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;清单为(在SQLAlchemy应用程序中):
IntegrityError: (IntegrityError)
(1062, "Duplicate entry '1532-?' for key 'PRIMARY'")在第二次表情符号插入尝试中。
第一个在db中似乎没有问题(相信我,它在我的控制台和浏览器中显示为“外星”表情符号):
> select tag_name, HEX(tag_name) from tags;
+----------+----------------+
| tag_name | HEX(tag_name) |
+----------+----------------+
| GOODGUY | 474F4F44475559 |
| | F09F91BD |
+----------+----------------+
2 rows in set (0.00 sec)我知道Emoji's in mysql turns to question marks,但是my.cnf有:
default-character-set = utf8mb4
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default-character-set = utf8mb4并且在客户端中使用utf8mb4 (将字符集添加到连接字符串中作为?charset=utf8mb4)。我相信主键是在服务器端检查的。
还有什么是我遗漏的(可以检查),还是需要一些MariaDB错误或一些额外的配置?
不确定是否相关,但通过mysql外壳插入相同的问题。还尝试过这样做,以了解发生了什么(在ci cause unique key collision中找到了这个):
> SELECT ''='' COLLATE utf8mb4_unicode_ci;
+------------------------------------+
| '?'='?' COLLATE utf8mb4_unicode_ci |
+------------------------------------+
| 1 |
+------------------------------------+但不确定这是否相关。
我不明白:数据库有时会显示得很好(通过客户端- shell和SQLAlchemy应用程序),但在头文件中却没有显示?从我得到的证据来看,我不明白这种糟糕的转变是怎么发生的。数据库中的数据似乎没有问题(参见上面的十六进制),但是两个表情符号等价于主键吗?
还有一个对比:
> SELECT ''='' COLLATE utf8mb4_bin;
+-----------------------------+
| '?'='?' COLLATE utf8mb4_bin |
+-----------------------------+
| 0 |
+-----------------------------+这种点指主键不使用二进制吗?在索引中使用之前,所有的表情符号都转换成其他的了?挺奇怪的。
发布于 2018-07-20 19:39:44
mysql> SELECT ''='' COLLATE utf8mb4_unicode_520_ci;
+----------------------------------------+
| '?'='?' COLLATE utf8mb4_unicode_520_ci |
+----------------------------------------+
| 0 |
+----------------------------------------+有两件事要注意:
为了进一步隔离..。
mysql> SELECT HEX('');
+----------+
| HEX('?') |
+----------+
| F09F9886 |
+----------+我的观点是,问号可能是显示问题,(正如您用十六进制指出的)它不是编码问题:
(1062, "Duplicate entry '1532-?' for key 'PRIMARY'")而且,如果您想用两个Emoji标记1532,那么该列需要是utf8mb4_unicode_520_ci (或utf8mb4_bin)。
https://stackoverflow.com/questions/51440368
复制相似问题