mysql 存储emoji

今天运营反馈了个问题,说用户发的【🔥】emoji表情,被篡改成了【🌚】;

具体情况:用户可以发起一个话题,话题的标题可以是任意字符,而且话题的标题是唯一的,做了个唯一索引

<?php
var_dump("🔥");
var_dump("🌚");
var_dump("🔥" === "🌚");

很明显,这两个表情,不是一样的,所以我看了下客户端post的数据

{“topicName”:”🔥”}

post数据没问题,接下来,查看下数据表字段定义,已经是utf8mb4超集

topic_name varchar(45) COLLATE utf8mb4_unicode_ci NOT NULL  COMMENT '话题名称'

然后我拿【🔥】去查询数据,select * from xxx where topic_name=”🔥”,居然查出topic_name=”🌚”的数据,然后使用select * from xxx where binary topic_name=”🔥” 并没有查出数据

于是乎恍然醒悟,

topic_name
该字段存储数据时,并不区分字母大小写,这对emoji表情而言是有致命问题,emoji表情对应的unicode编码是区分大小写的

所以,综上所述,给

topic_name
加上严格的大小写限制

alter table xxx change topic_name topic_name varchar(45) BINARY NOT NULL COMMENT '话题名称'

Leave Comment

电子邮件地址不会被公开。 必填项已用*标注