当前位置: 首页 > 知识库问答 >
问题:

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

轩辕修能
2023-03-14

自从Mysql

但是如果CHAR类型的列是一个字母数字字符串,在UTF8或latin1中自定义排序规则会更好吗?

我使用Flask-SqlalChemy,我的项目设置SQLALCHEMY_DATABASE_URI='mysqlmysqldb://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)

==

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吗。列(db.String(168,collation=“utf8\u general\u ci”))

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

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

共有1个答案

景国兴
2023-03-14

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

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

utf8移动到utf8mb4很好。前者是后者的子集。不同的是表情符号和一些中国人。

latin1utf8utf8mb4混在一起是可能的,但是这个论坛充满了搞砸的程序员/dba。

8.0将默认值更改为utf8mb4有很多好的理由。

请注意MySQL的xxxx_yyy_ci惯例是适用于字符集xxxx的归类。这utf8_general_ci属于utf8,而不是utf8mb4。

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

 类似资料:
  • 问题内容: 我是OOP范式的新手,所以可能对此问题有一个简单的解释… 您是否总是需要在类中声明公共对象范围的变量?例如: 在此代码中,即使是唯一声明的变量,也一样可访问和可用-似乎就像我将其声明为public一样。 如果未声明的类变量始终可以这样访问,那么将它们全部预先声明的意义何在? 问题答案: 该变量不是未初始化的,只是未声明的。 在类定义中声明变量是提高可读性的一种方式。另外,您可以设置可访

  • 问题内容: 我注意到,如果我对打开的文件进行迭代,则无需“读取”该文件即可更快地对其进行迭代。 即 比 第二个循环将花费大约1.5倍的时间(我在完全相同的文件上使用了timeit,结果是0.442对0.660),并且会得到相同的结果。 所以-我什么时候应该使用.read()或.readlines()? 由于我一直需要遍历正在读取的文件,并且在学习了艰难的方式之后,.read()在大数据上的运行速度

  • 问题内容: 我正在尝试使用 BufferedReader 通过URL上的InputStreamReader 从Web文档中读取文本(到某些Apache服务器上的文件)。 现在,这很好。但是显然,我希望读者不要只读一行,而应该读文件中的所有行。 查看BufferedReader API,以下代码应做到这一点: 即在有更多行时读取所有行,在没有更多行时停止。但是,此代码不起作用-读者 永远不会 报告

  • 问题内容: 为什么以及何时应该在php中使用该函数?使用后是否应该始终使用它?我读到我必须使用它来防止会话固定,这是唯一原因吗? 问题答案: 什么啊 就像函数名称所说的那样,它是一个函数,它将用新的ID替换当前的会话ID,并保留当前的会话信息。 它有什么作用? 它主要有助于防止会话固定攻击。会话固定攻击是恶意用户试图利用系统中的漏洞固定(设置)另一个用户的会话ID(SID)的地方。这样,他们将拥有

  • 问题内容: 有什么区别?什么时候应该使用容量为1的对抗? 问题答案: SynchronousQueue更像是一个传递,而LinkedBlockingQueue仅允许单个元素。区别在于对SynchronousQueue的put()调用直到有相应的take()调用 才返回 ,但LinkedBlockingQueue的大小为1,则put()调用(对空队列)将立即返回。 我不能说自己曾经直接使用过Sync

  • 问题内容: 我对使用和翻译有疑问。我了解到,在模型中,我应该使用。但是还有其他地方我也应该使用吗?表单定义呢?它们之间是否存在性能差异? 编辑: 还有一件事。有时候,代替被使用。正如文档所述,仅在将字符串显示给用户之前,才将字符串标记为要翻译,并在可能的最新情况下进行翻译,但是我在这里有点困惑,这与功能相似吗?我仍然很难决定在模型和表格中应该使用哪个。 问题答案: ugettext() 与 uge