Golang 如何使用 gorm 存取帶有 emoji 表情的數據
- 結論:在 mysql 中盡量使用 utf8mb4,不要使用 utf8。
- db報錯信息:`Error 1366 (HY000): Incorrect string value: '\\xE6\\x8C\\xA5\\xE7\\xAC\\xA6...'`
- 根本原因:emoji 4個字節,mysql 的 utf8 3個字節,mysql 的 utf8mb4 4個字節
- 解決方案:
- 1. 【前置條件】修改數據庫的字符集配置,然后重啟數據庫:確保存儲emoji的字段類型為 `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語句:
# 修改數據庫字符集:
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
其他補充
- MySQL 5.7 及之前版本默認的字符集是 latin1,MySQL 8.0 版本默認的字符集是 utf8mb4 。
- 不過使用 latin1 容易導致亂碼,所以還是 utf8 和 utf8mb4 用途最廣泛。
- mysql 的 utf8 其實是 utf8mb3 的別名,只使用 1~3 個字節表示字符。
- mysql 的 utf8mb4 使用 1~4 個字節表示字符,能夠存儲更多的 emoji 表情及任何新增的 Unicode 字符。utf8mb4 兼容 utf8 ,且比 utf8 能表示更多的字符,是 utf8 字符集的超集。
- 所以現在一些新的業務建議將數據庫的字符集設置為 utf8mb4 ,特別是有表情存儲需求時。