首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表情符号在MariaDB主键中的问号

表情符号在MariaDB主键中的问号
EN

Stack Overflow用户
提问于 2018-07-20 10:20:22
回答 1查看 593关注 0票数 0

在下表中,使用mariadb-server-10.1 10.1.32+maria-1~信任:

代码语言:javascript
复制
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应用程序中):

代码语言:javascript
复制
IntegrityError: (IntegrityError) 
(1062, "Duplicate entry '1532-?' for key 'PRIMARY'")

在第二次表情符号插入尝试中。

第一个在db中似乎没有问题(相信我,它在我的控制台和浏览器中显示为“外星”表情符号):

代码语言:javascript
复制
> 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有:

代码语言:javascript
复制
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中找到了这个):

代码语言:javascript
复制
> SELECT ''='' COLLATE utf8mb4_unicode_ci;
+------------------------------------+
| '?'='?' COLLATE utf8mb4_unicode_ci |
+------------------------------------+
|                                  1 |
+------------------------------------+

但不确定这是否相关。

我不明白:数据库有时会显示得很好(通过客户端- shell和SQLAlchemy应用程序),但在头文件中却没有显示?从我得到的证据来看,我不明白这种糟糕的转变是怎么发生的。数据库中的数据似乎没有问题(参见上面的十六进制),但是两个表情符号等价于主键吗?

还有一个对比:

代码语言:javascript
复制
> SELECT ''='' COLLATE utf8mb4_bin;
+-----------------------------+
| '?'='?' COLLATE utf8mb4_bin |
+-----------------------------+
|                           0 |
+-----------------------------+

这种点指主键不使用二进制吗?在索引中使用之前,所有的表情符号都转换成其他的了?挺奇怪的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-20 19:39:44

代码语言:javascript
复制
mysql> SELECT ''='' COLLATE utf8mb4_unicode_520_ci;
+----------------------------------------+
| '?'='?' COLLATE utf8mb4_unicode_520_ci |
+----------------------------------------+
|                                      0 |
+----------------------------------------+

有两件事要注意:

  • 520校对将它们视为不同。
  • 问号是显示问题。

为了进一步隔离..。

代码语言:javascript
复制
mysql> SELECT HEX('');
+----------+
| HEX('?') |
+----------+
| F09F9886 |
+----------+

我的观点是,问号可能是显示问题,(正如您用十六进制指出的)它不是编码问题:

代码语言:javascript
复制
(1062, "Duplicate entry '1532-?' for key 'PRIMARY'")

而且,如果您想用两个Emoji标记1532,那么该列需要是utf8mb4_unicode_520_ci (或utf8mb4_bin)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51440368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档