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

时间:2019-06-13 07:45:40

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

由于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并在所有地方使用它吗?

1 个答案:

答案 0 :(得分:0)

展望未来,您应该对几乎所有CHAR / VARCHAR / TEXT列都使用utf8mb4。

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

utf8移至utf8mb4是一件好事。前者是后者的子集。区别是表情符号和一些中文。

可以将latin1utf8utf8mb4进行混合,但是这个论坛到处都是程序员/ dbas,他们把它搞砸了。

8.0出于很多原因将默认值更改为utf8mb4。

请注意,MySQL的xxxx_yyy_ci约定为归类,适用于字符集 xxxx。那是utf8_general_ci属于utf8,不是 utf8mb4。

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