【问题标题】:How does CHAR(n) represent its data in binary?CHAR(n) 如何以二进制表示其数据?
【发布时间】:2018-08-12 21:00:05
【问题描述】:

我目前正在阅读 Robin Nixon 的 Learning PHP、MySQL 和 JavaScript 一书。特别是关于使用 MySQL 的数据库的章节。这是我正在努力彻底理解的主题。

"然而,年份字段具有更可预测的值,因此我们使用更有效的 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 亿有符号,这将是可以存储的数量。

感谢任何解释。

【问题讨论】:

    标签: mysql database binary char mariadb


    【解决方案1】:

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

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

    这是“一分钱一分货,一分钱一分货”的例子。

    对这本书(或任何书)持保留态度。请记住,科技书籍是人写的,他们可能会犯错误。

    【讨论】:

    • 如果一本书在产品发布之前已经印刷,请保持警惕。
    【解决方案2】:

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

    • INT(4) 可以存储在 2 个字节中并且最好(因为它没有 2156 年的问题)。 实际上是 4 个字节; SMALL INT 占用 2 个字节,正如@BillKarwin 提到的那样。
    • CHAR(4) 通常(单字节字符集)限制为 4 个字节,但 CHAR 用空格填充,例如 '712 ',不能立即与算术一起使用。
    • VARCHAR(4) 需要的不仅仅是 CHAR(4),还允许使用更小的字符串 '712'

    【讨论】:

    • INT 始终为四个字节,与 (4) 参数无关。 SMALLINT 是两个字节。
    • VARCHAR(4) 有一个 1 字节长度的字段。因此,对于较短的字符串,它比CHAR 更紧凑,而对于全尺寸的字符串则不那么紧凑。
    • @RickJames 谢谢;在我看来,主要区别在于 CHAR 用空格填充,所以 VARCHAR 似乎是一个合乎逻辑的选择,大小或没有大小。
    猜你喜欢
    • 2022-01-27
    • 2011-03-31
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2011-10-02
    相关资源
    最近更新 更多