Golang 如何使用 gorm 存取带有 emoji 表情的数据

Golang 如何使用 gorm 存取带有 emoji 表情的数据

  • [结论:在 mysql 中尽量使用 utf8mb4,不要使用 utf8。](#结论:在 mysql 中尽量使用 utf8mb4,不要使用 utf8。)
  • [db报错信息:`Error 1366 (HY000): Incorrect string value: '\\xE6\\x8C\\xA5\\xE7\\xAC\\xA6...'`](#db报错信息:Error 1366 (HY000): Incorrect string value: '\\xE6\\x8C\\xA5\\xE7\\xAC\\xA6...')
  • [根本原因:emoji 4个字节,mysql 的 utf8 3个字节,mysql 的 utf8mb4 4个字节](#根本原因:emoji 4个字节,mysql 的 utf8 3个字节,mysql 的 utf8mb4 4个字节)
  • 解决方案:
    • [1. 【前置条件】修改数据库的字符集配置,然后重启数据库:确保存储emoji的字段类型为 `utf8mb4`](#1. 【前置条件】修改数据库的字符集配置,然后重启数据库:确保存储emoji的字段类型为 utf8mb4)
    • [2. 修改 gorm 的数据库连接串配置,改为 `charset=utf8mb4`,然后重启项目](#2. 修改 gorm 的数据库连接串配置,改为 charset=utf8mb4,然后重启项目)
  • 其他补充:
  • 关联文档:

结论:在 mysql 中尽量使用 utf8mb4,不要使用 utf8。

db报错信息:Error 1366 (HY000): Incorrect string value: '\\xE6\\x8C\\xA5\\xE7\\xAC\\xA6...'

根本原因:emoji 4个字节,mysql 的 utf8 3个字节,mysql 的 utf8mb4 4个字节

emoji 表情是4个字节,而 mysql 的 utf8 编码最多3个字节,所以数据插不进去。

而 mysql 的 utfmb4 是支持4个字节的,所以将 mysql 编码从 utf8 转换成 utf8mb4 就能解决。

解决方案:

1. 【前置条件】修改数据库的字符集配置,然后重启数据库:确保存储emoji的字段类型为 utf8mb4

根据实际需要选择运行下面的sql语句:

sql 复制代码
# 修改数据库字符集:
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

# 修改表的字符集:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

# 修改字段的字符集:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

#查看表字段的字符集
show full columns from table_name;

2. 修改 gorm 的数据库连接串配置,改为 charset=utf8mb4,然后重启项目

比如:
user:password@tcp(host)/dbname?charset=utf8&parseTime=True&loc=Local

修改为 charset=utf8mb4 后:
user:password@tcp(host)/dbname?charset=utf8mb4&parseTime=True&loc=Local

其他补充:

  1. MySQL 5.7 及之前版本默认的字符集是 latin1,MySQL 8.0 版本默认的字符集是 utf8mb4 。
  2. 不过使用 latin1 容易导致乱码,所以还是 utf8 和 utf8mb4 用途最广泛。
  3. mysql 的 utf8 其实是 utf8mb3 的别名,只使用 1~3 个字节表示字符。
  4. mysql 的 utf8mb4 使用 1~4 个字节表示字符,能够存储更多的 emoji 表情及任何新增的 Unicode 字符。utf8mb4 兼容 utf8 ,且比 utf8 能表示更多的字符,是 utf8 字符集的超集。
  5. 所以现在一些新的业务建议将数据库的字符集设置为 utf8mb4 ,特别是有表情存储需求时。

关联文档:

mysql 函数 md5 踩坑记录,报错:Error 1366 (HY000): Incorrect string value: '\xE6\x8C\xA5\xE7\xAC\xA6...

相关推荐
测试开发Kevin1 分钟前
小tip:换行符CRLF 和 LF 的区别以及二者在实际项目中的影响
java·开发语言·python
松☆37 分钟前
Dart 核心语法精讲:从空安全到流程控制(3)
android·java·开发语言
编码者卢布1 小时前
【Azure Storage Account】Azure Table Storage 跨区批量迁移方案
后端·python·flask
编码者卢布1 小时前
【App Service】Java应用上传文件功能部署在App Service Windows上报错 413 Payload Too Large
java·开发语言·windows
kaikaile19951 小时前
结构风荷载理论与Matlab计算
开发语言·matlab
切糕师学AI1 小时前
ARM 汇编器中的伪指令(Assembler Directives)
开发语言·arm开发·c#
吕司2 小时前
Qt的信号与槽
开发语言·qt
bjxiaxueliang2 小时前
一文掌握C/C++命名规范:风格、规则与实践详解
c语言·开发语言·c++
玄〤3 小时前
Java 大数据量输入输出优化方案详解:从 Scanner 到手写快读(含漫画解析)
java·开发语言·笔记·算法
NBhhbYyOljP3 小时前
LabVIEW与西门子PLC S7200SMART 12001500 300 400
golang