Ionic 3应用表情符号存入MySQL显示为????问题求助
????的问题 嗨,我来帮你搞定这个表情显示成????的问题!结合你说的情况——关闭应用时通知表情正常,但打开应用和数据库里都显示乱码,虽然数据库表已经设了utf8mb4_bin,但肯定是数据传输或读写的某个环节没跟上utf8mb4的配置,咱们一步步来排查:
第一步:检查数据库连接的编码配置
不管你用的是哪种后端驱动(比如mysql2、TypeORM),连接数据库的时候必须明确指定charset为utf8mb4,而不是默认的utf8(MySQL的原生utf8只支持3字节字符,表情是4字节的,根本存不下)。举两个常见例子:
要是用mysql2的话,连接配置得这么写:const connection = mysql.createConnection({ host: '你的数据库地址', user: '用户名', password: '密码', database: '数据库名', charset: 'utf8mb4' // 这个是关键!不能少 });要是用TypeORM,配置文件里要加上这两行:
{ "type": "mysql", "charset": "utf8mb4", "collation": "utf8mb4_bin" }第二步:验证表字段的编码设置
你说表的排序规则是utf8mb4_bin,但有可能字段本身的编码没跟上!有些时候表设置了新编码,但旧字段还是继承了之前的utf8。可以用这条SQL查一下:SHOW FULL COLUMNS FROM 你的待办事项表名;看
Collation列对应的内容字段是不是utf8mb4_bin,如果不是,就用这条语句修改:ALTER TABLE 你的待办事项表名 MODIFY COLUMN 内容字段名 TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;第三步:检查前后端接口的编码
确保前后端交互的HTTP请求和响应都用utf-8编码。后端返回数据的时候,要设置响应头Content-Type: application/json; charset=utf-8,前端发送请求时也尽量明确这个头。不然4字节的表情字符在传输过程中会被截断,到了前端就变成????了。第四步:测试数据写入链路
可以先跳过应用,直接用SQL语句往数据库插个表情试试:INSERT INTO 你的待办事项表名 (内容字段名) VALUES ('😀测试表情');然后查询看数据库里显示正常不。如果直接插完是好的,那问题就出在应用写入的环节——要么前端传数据时编码不对,要么后端接收时没正确解析;如果直接插也乱码,那还是数据库本身的配置问题(比如数据库服务器的默认编码不是utf8mb4,得改my.cnf/my.ini)。
第五步:排查前端渲染的小概率情况
因为你说通知里显示正常,所以前端渲染的问题可能性不大,但也可以试试:在前端拿到接口返回的数据后,先console.log一下原始内容,如果原始内容已经是????,那问题肯定在后端到数据库的环节;如果原始内容是正确的表情,那可能是某个Ionic组件的渲染问题,试试用原生的<div>代替组件渲染文本看看。
按照上面的步骤逐一排查,应该就能解决问题了——核心就是确保从前端→后端→数据库的整个链路都支持4字节的utf8mb4编码,毕竟表情这类emoji都是4字节的Unicode字符,普通utf8根本扛不住~
内容的提问来源于stack exchange,提问作者spaceman

