数据库支持emoj表情包

2024-10-24  本文已影响0人  royluck

当我在一个富文本内容,提交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 编码只支持三字节字符,不支持表情符号等特殊字符。


解决方法:

  1. 将数据库的字符集设置为 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;

  1. 重启应用程序,确保编码更改生效。

当我按照上述方法修改之后还是不行,继续按照下述方法尝试:

  1. 确保 MySQL 配置支持 utf8mb4: 您需要检查 MySQL 的全局设置,确保字符集配置正确。

旧配置内容:

[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 服务

  1. 验证数据库字符集设置:
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 image.png

继续重新安装cymysql

pipenv install cymysql==1.0.3 # 指定版本升级 cymysql 终于升级成功了 
# Pipfile 和 Pipfile.lock 也同步更新了,问题也都解决了!!!!!!


我原先创建的数据库字符集是:

create database titao charset utf8;
show create database titao;

image.png
上一篇 下一篇

猜你喜欢

热点阅读