玖叶教程网

前端编程开发入门

为什么在很多开源产品中,MySQL 数据库的字符串列宽要设置成191?

当你查看一些开源产品的数据库结构的时候,你可能会经常看到表中模型字段的类型被设置成了varchar(191)(如附图)。乍一看是不是有点疑惑,心想这里为什么要设置成191,而不是255,或其他数字呢?191是怎么来的?

下面我就和大家一起来研究研究。

首先,我们要知道在MySQL中,varchar(191)里的数字表示的是该字段可支持的字符串的最大长度。比如,这里是191,那就表示该字段最多可支持存储191个字符串。

那为什么varchar类型要限制存储其中的字符串的长度,而不像text类型、blob类型等不设置限制呢?

这与MySQL数据库中的索引有关。在MySQL数据库中,索引在使用之前,是需要进行优化的,而优化的其中一个要求就是可提前预测索引内容的长度,而text类型、blob类型长度不受限制,因此,MySQL优化器就不能很好地对其进行索引优化,这样对于text类型、blob类型这样的字段,即使设置了索引,最后查询的时候,你也可能会发现其查询性能不是很好。

ok,varchar可以设置长度,但为什么varchar类型的长度就要是191呢?

varchar类型的长度要设置成191,这与MySQL数据库的历史和所选择的编码有关。在早期,MySQL为了降低使用内存,提升性能,以及兼容同时期的其他SQL数据库(sybase/SAP),默认将索引字段的最大长度限制在255个字符。这导致当时的很多开源框架,如Wordpress、Django 和 Rails 等,都遵循 MySQL 的默认设置,以使它们可以在多种数据库上运行。

在使用innodb存储引擎,utf8编码的情况下,一个字符占用3个字节,255个字符串最多只需要767(255 x 3 = 765,另外2个字节用于存储字符串的长度)个字节即可存储。但是,由于后面出现了emoji表情,utf8编码即不再适用,我们不得不使用utf8mb4编码。而在此编码下,一个字符占用4个字节,这样在总索引空间不变的情况下,可存储的字符串长度就变成了191(767 / 4 = 191)。

虽然,在现代数据库中,像utf8mb4编码这样的可以支持“所有”字符的字符编码是默认的,固定长度的索引也已成为过去。 但是,在许多应用程序中仍然使用这些 191 个字符的默认值以确保兼容性。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言