django.db.utils.OperationalError: (1366, "Incorrect string value: '\\xF0\\x9F\\x90\\x8D \\xC2...' )

这篇博客详细介绍了在遇到Django操作数据库时出现的OperationalError: (1366, "Incorrect string value")问题的原因和解决方法,涉及到Python 3.7.4, Django 2.2.5与MySQL的兼容性,以及如何通过修改MySQL配置文件my.ini确保UTF-8编码,以支持包括emoji在内的特殊字符。" 122420194,7551727,Nginx配置实现前后端分离及解决跨域Cookie问题,"['Nginx', '运维', '前端', '后端', '跨域']

该错误发生在将数据保存到数据库的时候。

一、说明

1.Python: 3.7.4

python --version

2.Django: 2.2.5

python
import django
django.get_version()

3.MySQL: 

 select version();

4.system: win10

二、问题分析

看到这个问题,首先想到了编码问题,然后查看数据库编码设置:

show variables like "%char%";

<think>我们正在解决Django插入数据时出现的"Incorrectstringvalue"错误,错误信息中包含字符如F09F9A80(这是一个火箭表情符号🚀),这通常是因为字符超出了utf8编码的范围。在MySQL中,utf8最多支持3个字节的字符,而表情符号需要4个字节,因此需要使用utf8mb4编码。根据引用内容,我们可以从以下几个方面解决:1.确保数据库、表以及列的字符集为utf8mb4(引用[4]提供了修改列的语句,但我们需要确保整个数据库和表都是utf8mb4)。2.Django的settings.py中,配置数据库的OPTIONS,设置字符集为utf8mb4(引用[2]和[5])。3.注意:引用[1]提到在TEST配置中设置CHARSET,但那是针对测试数据库的。而我们目前的问题需要修改的是默认数据库配置。步骤:1.首先,检查并修改MySQL数据库、表及字段的字符集为utf8mb4。-修改数据库的默认字符集:```sqlALTERDATABASEyour_database_nameCHARACTERSET=utf8mb4COLLATE=utf8mb4_unicode_ci;```-修改表的字符集(以user_info表为例):```sqlALTERTABLEuser_infoCONVERTTOCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;```-如果只想修改某一列(如引用[4]):```sqlALTERTABLEuser_infoMODIFYnameVARCHAR(100)CHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;```2.修改Django的settings.py,在DATABASES的default配置中加入OPTIONS:```pythonDATABASES={&#39;default&#39;:{&#39;ENGINE&#39;:&#39;django.db.backends.mysql&#39;,&#39;NAME&#39;:&#39;your_database_name&#39;,&#39;USER&#39;:&#39;your_user&#39;,&#39;PASSWORD&#39;:&#39;your_password&#39;,&#39;HOST&#39;:&#39;127.0.0.1&#39;,&#39;PORT&#39;:&#39;3306&#39;,&#39;OPTIONS&#39;:{&#39;charset&#39;:&#39;utf8mb4&#39;,#这里使用utf8mb4字符集}}}```3.另外,确保在创建数据库连接时使用的字符集是utf8mb4。如果使用Django,上述配置应该足够。注意:在修改数据库和表的字符集之前,最好备份数据,因为修改字符集可能会影响现有数据(虽然通常不会,但以防万一)。如果已经出现了错误,并且上述修改后仍然存在,可能需要检查是否所有相关的列都转换成了utf8mb4。特别是插入数据的列(例如错误信息中提到的&#39;tool_introduction&#39;列)需要确保使用utf8mb4。总结:-修改数据库和表的字符集为utf8mb4。-在Django的配置中增加&#39;OPTIONS&#39;:{&#39;charset&#39;:&#39;utf8mb4&#39;}。-确保客户端连接也使用utf8mb4(通过Django的配置已经实现)。引用[3]和[5]都提到设置&#39;OPTIONS&#39;:{&#39;charset&#39;:&#39;utf8mb4&#39;},所以重点在于此。相关问题:1.如何检查MySQL数据库、表或列的当前字符集?2.除了设置utf8mb4,还需要注意哪些配置以避免字符编码问题?3.Django中如何为不同的数据库配置不同的字符集?</think> ### 解决Django插入数据时"Incorrect string value"错误 出现`django.db.utils.OperationalError: (1366, "Incorrect string value")`错误是因为包含**4字节Unicode字符**(如表情符号🚀 = `F0 9F 9A 80`)的数据试图存入仅支持3字节UTF8MySQL字段[^3]。以下是完整解决方案: #### 1️⃣ 修改MySQL数据库配置 ```sql -- 修改数据库字符集 ALTER DATABASE your_db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; -- 修改目标表字符集(示例) ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` > 📌 特别注意修改实际报错的列(如错误中的`tool_introduction`列)[^4] #### 2️⃣ 修改Django设置(关键步骤) ```python # settings.py DATABASES = { &#39;default&#39;: { &#39;ENGINE&#39;: &#39;django.db.backends.mysql&#39;, &#39;NAME&#39;: &#39;your_db&#39;, &#39;USER&#39;: &#39;user&#39;, &#39;PASSWORD&#39;: &#39;password&#39;, &#39;HOST&#39;: &#39;localhost&#39;, &#39;PORT&#39;: &#39;3306&#39;, &#39;OPTIONS&#39;: { &#39;charset&#39;: &#39;utf8mb4&#39;, # 必须配置此项[^2][^5] } } } ``` #### 3️⃣ 验证配置效果 在Django shell中检查连接参数: ```python from django.db import connection print(connection.settings_dict[&#39;OPTIONS&#39;]) # 应输出: {&#39;charset&#39;: &#39;utf8mb4&#39;} ``` #### 4️⃣ 永久解决方案 创建新数据库时指定utf8mb4: ```sql CREATE DATABASE new_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` > ⚠️ 注意: > - 不要混淆`TEST`配置(用于测试数据库)和`OPTIONS`(用于主数据库)[^1] > - 确保MySQL版本 ≥ 5.5.3(支持utf8mb4) > - 开发/生产环境需同步修改 --- ### 相关问题 1. 如何检查MySQL表当前的字符集和校对规则? 2. `utf8`与`utf8mb4`在存储表情符号时的具体区别是什么? 3. 除数据库配置外,Django还有哪些设置可能影响字符编码处理? 4. 如何批量修改现有数据库中所有表的字符集为utf8mb4? 5. 遇到`Illegal mix of collations`错误时应如何解决? > 引用文献: > [^1]: TEST配置说明 > [^2]: OPTIONS配置utf8mb4方案 > [^3]: 4字节字符错误分析 > [^4]: ALTER TABLE修改字段 > [^5]: Django字符集配置实践
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值