解决mysql存储特殊文字(表情符号)utf8mb4

本文介绍了在使用MySQL存储包含特殊字符(如QQ表情)的数据时遇到的问题及解决方案,包括调整数据库连接编码、更改数据库字符集编码页等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景

爬取数据过程中,会遇到一些特殊的字符入库出错的问题,比如二进制数据、比如特殊文字(类似QQ表情)等。

Siberian Husky fighting

这样的标题,后面就带有一个表情。

在mysql存储的时候,报错信息如下:

[Failure instance: Traceback: <class 'pymysql.err.InternalError'>: (1366, "Incorrect string value: '\\xF0\\x9F\\x90\\xB6' for column 'title' at row 1")

大致意思是指title这个字段无法存储这种字符。

解决办法

经过网上搜索mysql 1366,多方查看后,终于找到了原因和解决的办法。

是因为\xF0\x9F\x90\xB6 它通常是4个字符存储,而mysql的utf8默认是3个字符存储。

1、 更改代码中数据库连接的字符编码charset为utf8mb4

MYSQL_CHARSET = 'utf8mb4'

2、将数据库字符集编码页改成utf8mb4。

3、检查数据表的字符编码,保持同步。

4、最后确认数据表中的字段,存储这种特殊文字的字段字符编码也是utf8mb4

输入图片说明

这样就解决了这个问题。

如果你没有小心处理好,可以尝试新建一个数据库,然后将默认的字符编码设置为utf8mb4.

### MySQL 8 中使用 `utf8mb4` 字符集存储表情符号时显示为空格的解决方案 当遇到在 MySQL 8 使用 `utf8mb4` 字符集存储表情符号却显示为空格的情况,通常是因为表结构或连接设置未能正确配置以支持完整的 UTF-8 编码范围。具体原因可能涉及以下几个方面: #### 数据库和表格字符集未完全转换到 `utf8mb4` 即使服务器级别的字符集已设为 `utf8mb4`,如果特定数据库或其下的某个表仍保持旧有的字符编码,则可能导致数据截断或错误解析。 为了确保整个环境都采用新的字符集标准,在创建新数据库或修改现有数据库时应指定 `CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci` 参数[^1]。对于已有表单,可以通过 ALTER TABLE 命令来更新它们的字符集属性: ```sql ALTER DATABASE your_database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci; ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; ``` #### 连接客户端至服务端过程中丢失了正确的字符集声明 除了调整内部的数据定义外,还需要确认应用程序与 MySQL Server 的交互过程中的字符集协商机制是否正常工作。这涉及到客户端驱动程序以及 SQL 查询本身如何告知服务器期望使用的字符集。 可以在建立会话之初通过执行如下命令显式设定当前对话所用字符集: ```sql SET NAMES 'utf8mb4'; ``` 或者更推荐的方式是在应用层面上配置持久化的默认字符集选项,比如 PHP 的 PDO 扩展允许直接在 DSN (Data Source Name) 中加入 charset=utf8mb4 参数。 另外值得注意的是,部分老旧版本的应用框架可能存在兼容性问题,无法妥善处理四字节UTF-8字符(`utf8mb4`),因此也需要检查并升级这些组件。 #### 验证字段类型能否容纳多字节字符 最后还需注意一点就是 VARCHAR 和 TEXT 类型字段的最大长度是以字符数而非字节数计算的;然而由于 emoji 等特殊符号占用四个字节的空间,所以在设计模式时要特别留意这一点以免造成意外溢出。例如原本计划用于存放不超过255个ASCII字符的空间实际上最多只能存放下约63个emoji图标[(255/4)](https://dev.mysql.com/doc/refman/8.0/en/charset-unicode.html)[^2]. 综上所述,针对上述情况采取适当措施后应该可以有效解决因字符集不匹配而导致的表情符号显示异常的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值