我正在阅读mysql文档中关于不同数据类型的字节大小的内容,但是在谈到char、varchar和decimal时有点困惑。有人能帮我解释一下这三种数据类型的字节数,并回答下面的字节数是多少吗
char(7) varchar(9) decimal(15,2) decimal(11,6)
谢谢
zvokhttg1#
char(n)可能是最令人困惑的,因为char在字符集中不是固定的字节大小。此外,不同的行格式处理这个问题的方式也不同。简而言之,如果您使用的是row\u format=compact、row\u format=dynamic或row\u format=compressed,那么char(n)会反转至少n个字节,以便在没有碎片的情况下实现就地更新。如果由于不同的字符编码而需要更多的字节,则根据需要使用更多的字节,尝试使用尽可能少的字节,并且使用的字节长度不超过最大字符字节长度n。如果您使用的是row_format=redundant,than char(n)总是使用最大字符字节长度n。varchar(n)和varbinary(n)将每列的最大字符长度设置为n。在n以下,mysql使用给定的字符串和字符编码所需的字节数。如果字符串小于256字节,mysql将使用一个额外的字节来记录字符串的长度。如果字符串长度大于255个字节,则使用2个字节来记录字符串长度。var列的存储效率很高,但是对于频繁更新的字符串列,可以使用固定长度的列(如binary)来换取性能。十进制的描述是非常不言自明的:“十进制(和数字)列的值是用二进制格式表示的,该格式将九个十进制(以10为基数)数字打包成四个字节。每个值的整数部分和小数部分的存储分别确定。九位数的每一个倍数需要四个字节,“剩余”位数需要四个字节的一小部分。下表给出了多余数字所需的存储空间。”
1条答案
按热度按时间zvokhttg1#
char(n)可能是最令人困惑的,因为char在字符集中不是固定的字节大小。此外,不同的行格式处理这个问题的方式也不同。简而言之,如果您使用的是row\u format=compact、row\u format=dynamic或row\u format=compressed,那么char(n)会反转至少n个字节,以便在没有碎片的情况下实现就地更新。如果由于不同的字符编码而需要更多的字节,则根据需要使用更多的字节,尝试使用尽可能少的字节,并且使用的字节长度不超过最大字符字节长度n。如果您使用的是row_format=redundant,than char(n)总是使用最大字符字节长度n。
varchar(n)和varbinary(n)将每列的最大字符长度设置为n。在n以下,mysql使用给定的字符串和字符编码所需的字节数。如果字符串小于256字节,mysql将使用一个额外的字节来记录字符串的长度。如果字符串长度大于255个字节,则使用2个字节来记录字符串长度。var列的存储效率很高,但是对于频繁更新的字符串列,可以使用固定长度的列(如binary)来换取性能。
十进制的描述是非常不言自明的:“十进制(和数字)列的值是用二进制格式表示的,该格式将九个十进制(以10为基数)数字打包成四个字节。每个值的整数部分和小数部分的存储分别确定。九位数的每一个倍数需要四个字节,“剩余”位数需要四个字节的一小部分。下表给出了多余数字所需的存储空间。”