Mysql: 我什么时候应该声明类型为 CHAR(String) 的 Column 以使用 UTF8 或 Latin1?
Mysql: When should I declare Column of type CHAR(String) to use UTF8 or Latin1?
因为 Mysql>=8.0 已经支持 UTF8MB4 中的排序规则。
但是如果 CHAR 类型的 Column 是字母数字字符串,那么在 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, collation="utf8_general_ci"))
UTF8MB4擅长支持海量字符编码。
我应该默认配置 utf8mb4 并在所有地方使用它吗?
今后,您应该对几乎所有 CHAR/VARCHAR/TEXT 列使用 utf8mb4。
CHARACTER SET utf8mb4
基本上涵盖了世界上所有的字符集。如果您的客户端将字符编码为 UTF-8
(utf8mb4 的外部等效项),那么 utf8mb4 是好的。
从 utf8
移动到 utf8mb4
很好。前者是后者的子集。不同的是Emoji和一些中文。
将 latin1
与 utf8
或 utf8mb4
混合使用是可能的,但是这个论坛上满是 programmers/dbas 搞砸了的人。
8.0 出于很多原因将默认值更改为 utf8mb4。
请注意 MySQL 的约定 xxxx_yyy_ci 是适用于 字符集 xxxx 的 排序规则 .即utf8_general_ci属于utf8,notutf8mb4.
一个"character set"是一种编码。排序规则是一组用于比较字符串的规则。示例:是否应将 'A'
视为等于 'a'
.
因为 Mysql>=8.0 已经支持 UTF8MB4 中的排序规则。
但是如果 CHAR 类型的 Column 是字母数字字符串,那么在 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, collation="utf8_general_ci"))
UTF8MB4擅长支持海量字符编码。
我应该默认配置 utf8mb4 并在所有地方使用它吗?
今后,您应该对几乎所有 CHAR/VARCHAR/TEXT 列使用 utf8mb4。
CHARACTER SET utf8mb4
基本上涵盖了世界上所有的字符集。如果您的客户端将字符编码为 UTF-8
(utf8mb4 的外部等效项),那么 utf8mb4 是好的。
从 utf8
移动到 utf8mb4
很好。前者是后者的子集。不同的是Emoji和一些中文。
将 latin1
与 utf8
或 utf8mb4
混合使用是可能的,但是这个论坛上满是 programmers/dbas 搞砸了的人。
8.0 出于很多原因将默认值更改为 utf8mb4。
请注意 MySQL 的约定 xxxx_yyy_ci 是适用于 字符集 xxxx 的 排序规则 .即utf8_general_ci属于utf8,notutf8mb4.
一个"character set"是一种编码。排序规则是一组用于比较字符串的规则。示例:是否应将 'A'
视为等于 'a'
.