当我在一个富文本内容,提交emoj表情的时候,后端接口报错:
raise InternalError(errno, errorvalue)
sqlalchemy.exc.InternalError: (cymysql.err.InternalError) (1366, "Incorrect string value: '\\\\xF0\\\\x9F\\\\x98\\\\x81' for column 'self_evaluation' at row 1")
[SQL: UPDATE register_info SET love_experience_count=%s, self_evaluation=%s, modify_time=%s WHERE register_info.info_id = %s]
[parameters: ('1', '我是一个男的❤�', 1729750673, 5)]
原因是:
错误 (1366, "Incorrect string value: '\\\\xF0\\\\x9F\\\\x98\\\\x81' for column 'self_evaluation' at row 1")
表示您试图向 self_evaluation
字段插入一个包含非标准字符(如表情符号 ❤
)的字符串,但数据库的字符集不支持这些字符。
这个问题的解决方法是确保数据库表和字段的字符集支持 UTF-8 的四字节字符(即 utf8mb4
编码),因为标准的 utf8
编码只支持三字节字符,不支持表情符号等特殊字符。
解决方法:
- 将数据库的字符集设置为
utf8mb4
- 这需要修改数据库、表以及字段的字符集。
修改数据库字符集:
ALTER DATABASE your_database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
修改表字符集:
ALTER TABLE register_info CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
修改字段字符集:
ALTER TABLE register_info
MODIFY self_evaluation TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 重启应用程序,确保编码更改生效。
当我按照上述方法修改之后还是不行,继续按照下述方法尝试:
-
确保 MySQL 配置支持
utf8mb4
: 您需要检查 MySQL 的全局设置,确保字符集配置正确。
- 修改 MySQL 配置文件(
my.cnf
或my.ini
),如下:
旧配置内容:
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=C:\\mysql-5.6.39-winx64
# 设置mysql数据库的数据的存放目录
datadir=C:\\mysql-5.6.39-winx64\\data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
collation-server=utf8_general_ci
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
[client]
default-character-set=utf8
修改后的内容:
[mysql]
# 设置mysql客户端默认字符集
default-character-set = utf8mb4
[mysqld]
#设置3306端口
port = 3306
# 设置mysql的安装目录
basedir=C:\\mysql-5.7.44
# 设置mysql数据库的数据的存放目录
datadir=C:\\mysql-5.7.44\\data
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-client-handshake = FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
[client]
default-character-set = utf8mb4
然后重启 MySQL 服务。
- 验证数据库字符集设置:
SHOW VARIABLES LIKE 'character_set%';
SHOW CREATE DATABASE titao;
SHOW CREATE TABLE register_info;
image.png
image.png
这时候发现表已经是utf8mb4了,但是Python 代码仍然不支持 emoji 或其他 utf8mb4
字符,后续我手动使用sql语句,插入emoj表情,发现可以插入成功。
INSERT INTO `titao`.`register_info` (`create_time`, `status`, `info_id`, `user_id`, `hometown_district`, `hometown_country`, `nickname`, `wechat_id`, `mobile`, `height`, `avatar_url`, `real_avatar_url`, `life_photo_url`, `love_experience_count`, `current_location_province`, `current_location_city`, `current_location_district`, `birthday`, `gender`, `identity_status`, `education_level`, `school_name`, `occupation`, `annual_income_range`, `modify_time`, `has_car_type`, `has_house_type`, `self_evaluation`, `ideal_partner`) VALUES (1729494499, 1, 5, 2, '陆丰', '东海街道', '的😁jason', 'super_tealer', NULL, 168, '<https://rong-44.oss-cn-shenzhen.aliyuncs.com/do0Mb0SKoQba65151dec155353e7dee1d8a48d368f3f.jpeg>', '<https://rong-44.oss-cn-shenzhen.aliyuncs.com/U0GQx3xjTqks12a864cc8b54feb18ff91d9f23a4e1f8.jpg>', '<https://rong-44.oss-cn-shenzhen.aliyuncs.com/hKZF9Pdql1wN97ae0b0e5bd2dbbaf6c7f5abecff702e.jpg>', 1, '广东省', '深圳市', '龙华区', 707328000, 1, 1, 5, '南方科技大学', '亚马逊运营', 1, 1729821311, 1, 2, '测试😀', 'selfEvaluation');
image.png
如果通过api获取该字段,发现也不能正常显示,接口返回 ? 标识。
这时候判断应该是python端连接mysql的驱动有问题,我这里用的是cymysql,版本是0.9.1,当我想通过下面方式(?charset=utf8mb4)会提示报错,这里排查可能是版本问题,尝试升级cymysql版本至最新版本1.0.3:
SQLALCHEMY_DATABASE_URI = \\
'mysql+cymysql://root:8831684lfrLfh!@@localhost/titao'
**改为:**
SQLALCHEMY_DATABASE_URI = \\
'mysql+cymysql://root:8831684lfrLfh!@@localhost/titao?charset=utf8mb4'
升级cymysql:
pipenv shell # 进入虚拟环境
pipenv graph # 显示cymysql是0.9.1 version
pipenv update cymysql # 执行升级操作,提示成功了,但是Pipfile 和 Pipfile.lock还是旧的
pipenv run pip show cymysql # 查看cymysql 的版本
pipenv install cymysql==1.0.3 # 指定版本升级 cymysql
执行 pipenv install cymysql==1.0.3,报错:
running build_ext
building 'cymysql.packet' extension
error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": <https://visualstudio.microsoft.com/visual-cpp-build-tools/>
----------------------------------------
ERROR: Failed building wheel for cymysql
ERROR: Could not build wheels for cymysql, which is required to install pyproject.toml-based projects
image.png
- 下载最新(Microsoft C++ 构建工具)[https://visualstudio.microsoft.com/visual-cpp-build-tools/]
继续重新安装cymysql
pipenv install cymysql==1.0.3 # 指定版本升级 cymysql 终于升级成功了
# Pipfile 和 Pipfile.lock 也同步更新了,问题也都解决了!!!!!!
我原先创建的数据库字符集是:
create database titao charset utf8;
show create database titao;
image.png
网友评论