CHAR(n)如何用二进制表示其数据?

时间:2018-08-12 21:00:06

标签: mysql database binary char mariadb

我目前正在阅读Robin Nixon的学习PHP,MySQL和JavaScript 书。特别是有关使用MySQL的数据库的章节。这是我正在努力深入理解的主题。

“然而,year字段具有更可预测的值,因此,我们使用更有效的CHAR(4)数据类型来代替VARCHAR。参数4允许4个字节的数据,支持从–999到9999;一个字节包含8位,其值可以为00000000到11111111,十进制为0到255。”

在上面的示例中,CHAR(4)设置为存储4个字符,这些字符代表四位数的年份条目。为什么-999到9999是唯一的选择。如何用二进制表示仅限于这些值?我最初的想法是,由于4个字节是32位,并且如果将所有32位都设置为1,则2 ^ 32大约是40亿无符号和大约20亿有符号,这就是可以存储的数量。

我感谢您的任何解释。

2 个答案:

答案 0 :(得分:1)

您引用的书似乎建议使用CHAR来存储年份值,即使它不以二进制形式存储,也会存储数字字符。您正确地认为,如果您使用四个字节来存储数字的二进制值,那么四个字节可以存储更大的范围。

令人惊讶的是,这本书担心要为VARCHAR的长度编码所需的单个额外字节,然后它使用CHAR以这种低效的方式存储数字年份值。

这是“聪明的一分钱,愚蠢的人”的例子。

把这本书(或任何一本书)与一粒盐一起吃。请记住,技术书籍是人写的,它们可能会犯错误。

答案 1 :(得分:0)

首先,对于有限的年份值,请使用YEAR(yyyy,1901至2155,或0000):1个字节。

  • INT(4)可以存储为2个字节,并且最好(因为它没有2156年的问题)。 实际上是4个字节;如@BillKarwin所述, SMALL INT 占用2个字节。
  • CHAR(4)通常(单字节字符集)限制为4个字节,但是CHAR用空格填充,例如'712 ',并且不能立即用于算术运算。 / li>
  • VARCHAR(4)比CHAR(4)需要更多的内容,并且还允许使用较小的字符串'712'