tp5+mysql 插入表情emoji,数据库报错的分析

Mysql保存包含emoj表情的字符串,日志查看如下:

[ error ] [10501]SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xF0\x9F\x90\xAE\xF0\x9F...' for column 'nickname' at row 1

原因分析

nickname字段插入的字符串异常,分析是因为字符串中包含表情。

移动端的emoji表情符号是4个字节,而MySQL的utf8编码最多3个字节,而该数据表及字段是utf8编码,所以插入不进去

解决思路及方案

  • 解决思路
    修改编码,将utf8 调整为utf8mb4。

utf8 与 utf8mb4 的区别

“utf8”只支持每个字符最多三个字节,而真正的UTF-8是每个字符最多四个字节。

MySQL一直没有修复这个bug,他们在2010年发布了一个叫作“utf8mb4”的字符集,绕过了这个问题。
最初的 UTF-8 格式使用一至六个字节,最大能编码 31 位字符。
最新的 UTF-8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。
 要在 Mysql 中保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以后的才支持
  • 解决方案

1、修改数据库编码:
字段编码: utf8mb4
数据表及库编码:utf8mb4

mysql编码:

[mysqld]
character-set-server = utf8mb4

2、修改了数据库后,仍然报错。因为应用使用的tp5框架,发现tp5连接数据库的默认charset 是utf8,修改为utf8mb4后,插入表情成功

    // 数据库编码默认采用utf8  修改为 utf8mb4
    'charset'         => 'utf8mb4',

总结
设置字段的编码为utf8mb4,tp5框架的数据库连接版本后,就可以保存成功表情

你可能感兴趣的:(tp5+mysql 插入表情emoji,数据库报错的分析)