postgresql 实践
pydantic 实践(一)基础
pydantic 实践(二)数据校验
SQLAlchemy 介绍与实践
SQLAlchemy 支持特殊字符
SQLAlchemy 支持特殊字符
- 1. 字符集介绍分析
- 2. MySQL 支持特殊字符
- 2.1. 更新 MySQL 字符集为 utf8mb4
- 2.2 更新已存在数据库的字符集
- 2.2.1. 更新数据库字符集
- 2.2.2. 更新数据表字符集
- 2.2.3. 更新列的字符集
- 2.3. 验证 MySQL 是否成功支持特殊字符
- 3. SQLAlchemy 支持 utf8mb4
- 3.1. 设置引擎编码方式为 utf8mb4
- 3.2. 设置数据库表编码方式为 utf8mb4
✋✊✌️❤️⭐️✨⚡️☀️☁️❄️☔️☕️✈️⚓️⌚️☎️⌛️✉️✂️✒️✏️❌♻️✅❎Ⓜ️
为什么 MySQL 默认不支持 Emoji 表情
数据库字符集指的是数据库中存储的字符的编码方式。常见的字符集包括 utf8、utf8mb4、latin1等。字符编码是将字符映射为计算机中的二进制数据的方式。
MySQL 数据库默认使用 utf8 字符集,该字符集最多只支持3字节的字符编码。因此,当存储4字节字符(如 Emoji 表情)时,MySQL 会将其存储为乱码或截断。
Emoji 表情是一种特殊的字符,它的编码超过了utf8 字符集所能表示的范围,需要使用 utf8mb4 字符集才能正确存储和处理。
1. 字符集介绍分析
参考:https://blog.csdn.net/AggressionStorm/article/details/100040588
utf8_general_ci 不区分大小写,这个在注册用户名和邮箱的时候就要使用。
utf8_general_cs 区分大小写,如果用户名和邮箱用这个就会照成不良后果。
utf8_bin: compare strings by the binary value of each character in the string 将字符串每个字符串用二进制数据编译存储,区分大小写,而且可以存二进制的内容。
utf8_unicode_ci 校对规则仅部分支持 Unicode 校对规则算法,一些字符还是不能支持。
utf8_unicode_ci 比较准确,utf8_general_ci 速度比较快。通常情况下 utf8_general_ci 的准确性就够我们用的了,在我看过很多程序源码后,发现它们大多数也用的是 utf8_general_ci,所以新建数据库时一般选用 utf8_general_ci 就可以了
2. MySQL 支持特殊字符
参考:
https://blog.csdn.net/lsoxvxe/article/details/133953726
https://blog.csdn.net/AsuraDong/article/details/82227659
2.1. 更新 MySQL 字符集为 utf8mb4
首先,需要编辑 MySQL 的配置文件(my.cnf或my.ini),将默认字符集设置为 utf8mb4。在配置文件中找到以下配置项,并修改为:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
保存修改后的配置文件,并重启 MySQL 服务,使配置生效。
sudo service mysql restart
2.2 更新已存在数据库的字符集
2.2.1. 更新数据库字符集
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
2.2.2. 更新数据表字符集
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2.2.3. 更新列的字符集
ALTER TABLE table_name MODIFY column_name column_type CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2.3. 验证 MySQL 是否成功支持特殊字符
CREATE TABLE emoji_test (
id INT PRIMARY KEY AUTO_INCREMENT,
emoji VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
);
INSERT INTO emoji_test (emoji) VALUES ('');
3. SQLAlchemy 支持 utf8mb4
参考:https://www.cnblogs.com/jassin-du/p/8987170.html
官网:https://www.osgeo.cn/sqlalchemy/orm/declarative_tables.html
3.1. 设置引擎编码方式为 utf8mb4
engine = create_engine("mysql+pymysql://root:123456@127.0.0.1:3306/sqldb01?charset=utf8mb4")
3.2. 设置数据库表编码方式为 utf8mb4
class UserType(Base):
__tablename__ = 'usertype'
id = Column(Integer, primary_key=True)
caption = Column(String(50), default='管理员')
# 添加配置设置编码
__table_args__ = {
'mysql_charset':'utf8mb4', 'mysql_collate':'utf8mb4_unicode_ci'
}
这样生成的 SQL 语句就自动设置数据表编码为 utf8mb4了,__table_args__还可设置存储引擎、外键约束等等信息。