2014-10-28 69 views
0

我知道utf8在MySQL中存储为固定长度为3个字节(24位),而utf4mb4是固定的4个字节。我认为拉丁文1是一个固定长度的1个字节 - 我的问题是MySQL ascii类型7位,并且与Latin-1相比,存在一些小的存储空间吗?MySQL字符串编码存储空间

+0

“我知道,UTF8在MySQL存储为一个固定长度的3个字节(24位)”从回答重复的风险,但只是要确定你明白:没有** **,utf8是**不存储为固定长度的3个字节。而且我不会**在这里讲述char vs varchar,字符存储在例如文本字段中的方式将根据特定字符的需要使用一个,两个或三个字节。 – 2016-10-17 16:31:45

+0

@FélixGagnon-Grenier我从此知道了。 – donatJ 2017-04-05 17:31:19

+0

是的,tbh我不记得我为什么评论这个。这个问题在答案中已经很清楚地解释了...... – 2017-04-05 23:26:20

回答

2

您的初始前提不正确。在VARCHAR以及*TEXT列中,utf8和utf8mb4字符只消耗每个字符的utf8表示所需的尽可能多的字节存储量。唯一固定的多字节分配是CHAR列,因为它们的宽度是固定的。

提示:要使用UTF-8节省空间,请使用VARCHAR而不是CHAR。否则,MySQL必须在CHAR CHARACTER SET utf8列中为每个字符保留三个字节,因为这是最大可能的长度。例如,MySQL必须为CHAR(10)CHARACTER SET utf8列预留30个字节。

http://dev.mysql.com/doc/refman/5.6/en/charset-unicode-utf8.html

否则,存储UTF8和utf8mb字符时,每个字符的最大字节数是用于每个字符

使用UTF8(或utf8mb4)时

Unicode字符设置时,必须记住并非所有字符都使用相同的字节数,并且可能需要高达每个字符三(4)字节。 [强调]

http://dev.mysql.com/doc/refman/5.6/en/storage-requirements.html

没有7比特存储字节跨度字符集。

但是,压缩整个表可以在较新的版本中完成,并且如果您拥有足够的CPU,则启用表压缩时服务器可以实际执行得更好,如果磁盘相对较慢或服务器花费了大量时间I/O限制。

http://dev.mysql.com/doc/refman/5.6/en/innodb-compression.html

+0

我并不是说我们的列大小是固定的,而是一个字符的大小。我很清楚text和varchar是可变的。我所说的是,UTF8通常是1字节到4字节,但在MySQL中,UTF8字符总是3字节,以速度的名义。这就是为什么utf8mb4存在的原因,因为像表情符号这样的东西需要4个字节,并且不能在MySQL中表示utf8 – donatJ 2014-10-29 13:19:36

+1

我已经从文档中添加了一个额外的引用 - MySQL中的utf8字符是3字节的*最大值*,但是*最小* 1个字节。你似乎在说MySQL中的utf8字符总是占用3个字节的“固定长度”,就好像存在着为了提高速度而故意存储效率低下的情况,但情况并非如此。MySQL中的utf8字符在行数据中只占用与UTF8编码中存储该字符所需的字节数相同的字节数(除了在'CHAR'列中,在所有字符最大时必须分配最大可消耗空间的情况下宽度)。 – 2014-10-29 16:44:25