Mysql:什么时候应该声明 CHAR(String) 类型的列使用 UTF8 或 Latin1?

标签 mysql utf-8 flask-sqlalchemy iso-8859-1 utf8mb4

自Mysql>=8.0开始支持UTF8MB4排序规则。

但是如果 CHAR 类型的列是字母数字字符串,那么使用 UTF8 或 latin1 自定义排序规则会更好吗?

<小时/>

我使用Flask-Sqlalchemy,并且我的项目设置SQLALCHEMY_DATABASE_URI = 'mysql+mysqldb://root:@localhost:3306/testdb?charset=utf8mb4'

但是将 mysql 升级到 8.0 后,所有表都使用 UTF8MB4 排序规则创建。

例如:

class Topic(db.Model, CoModel):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(168))
    content = db.Column(db.Text)

==>mysql

CREATE TABLE `topic` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(168) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `content` text COLLATE utf8mb4_general_ci ,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

我应该自定义name = db.Column(db.String(168, collat​​ion="utf8_general_ci"))

<小时/>

UTF8MB4擅长支持海量字符编码。

我应该默认配置 utf8mb4 并在任何地方使用它吗?

最佳答案

今后,您应该对几乎所有 CHAR/VARCHAR/TEXT 列使用 utf8mb4。

字符集utf8mb4基本上涵盖了世界上所有的字符集。如果您的客户端将字符编码为 UTF-8(utf8mb4 的外部等效形式),那么 utf8mb4 就很好。

utf8 迁移到 utf8mb4 很好。前者是后者的子集。区别在于Emoji和一些中文。

latin1utf8utf8mb4混合是可能的,但是这个论坛充满了搞砸的程序员/数据库。

出于很多充分的理由,8.0 将默认值更改为 utf8mb4。

请注意,MySQL 的约定 xxxx_yyy_ci 是适用于字符集 xxxx 的排序规则。也就是说 utf8_general_ci 属于 utf8, utf8mb4。

“字符集”是一种编码。排序规则是一组用于比较字符串的规则。示例:'A' 是否应该被视为等于 'a'

关于Mysql:什么时候应该声明 CHAR(String) 类型的列使用 UTF8 或 Latin1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56575679/

相关文章:

mysql - 将一个表与另一个表中的多行联接

php - 基于外键表列值的Mysql结果

java - UTF8编码问题?

pandas - 动态导入 csv 并将其映射到 sqlalchemy

python - SQLAlchemy:在连接查询中使用删除/更新

MySQL 返回 : errno: 150 - foreign key error

javascript - 该对象的 key 以什么格式存储? %00*%00_数据

python - Jupyter 笔记本 - 如何在脚本之间移动 utf-8 字符?

python - Query.update() 的 sqlalchemy onupdate 不一致行为

php - 动态地将值插入两个不同的数据库