MySQL 数据类型 - 有符号无符号
Posted
技术标签:
【中文标题】MySQL 数据类型 - 有符号无符号【英文标题】:MySQL Datatypes - Signed Unsigned 【发布时间】:2017-04-05 17:50:27 【问题描述】:让我们考虑一下 TINYINT。 W3Schools 表示有符号范围是 -128 到 127,无符号范围是 0 到 255。
1) 为什么说它的范围是-128到127,为什么不说它的范围是-128到255。
2) 这些范围是否意味着我不能取值 -129 或 256 ? (假设我正在填写一个有文本框的表单)
【问题讨论】:
1.因为its range is from -128 to 255
不正确。 2. 是的,您不能将tinyint
用于 256 或 -129。
【参考方案1】:
TINYINT
用 8 位(1 个字节)表示。信息论的基础知识说只有 256 个不同的值 (256 = 2^8) 可以用 8 位表示。
“tinyint”的 8 位是interpreted by mysql,有两种方式之一:
TINYINT UNSIGNED
,其中 256 个值解释为0..255
TINYINT SIGNED
(别名TINYINT
,因为SIGNED
是默认值),
其中解释的范围为-128..127
当最高位为0
时,这8位代表SIGNED
和UNSIGNED
之间的0..127。但是当最高位是1
时,这8位要么代表负数,要么代表更大的正数。
如果您愿意,您可以解释这 256 个值的含义为“红色”、“黄色”、“绿色”等。这正是不同数据类型所发生的情况:
ENUM('red', 'yellow', 'green')
另一种解释 8 位字节为您提供ASCII 字符。见CHAR
、VARCHAR
、TEXT
等
由于TINYINT
必须是SIGNED
或UNSIGNED
,您不能拥有一个TINYINT
列同时包含以下两个值:-111 和222(在不同的行中)。如果需要,请使用SMALLINT SIGNED
。 (这就引出了关于数字的 16 位表示的讨论。)
【讨论】:
【参考方案2】:tinyint 值不是从 -128 到 255 这就是他们不说的原因。
在创建表时,它要么是有符号的,要么是无符号的。如果不指定,则默认为有符号 -128 到 127。如果在创建表时指定无符号,则其值为 0 到 255。
CREATE TABLE `example_table` (
`example_col` tinyint(3) unsigned NOT NULL
);
第二个答案是“是”,您不能在 tinyint 中使用 -129 或 256 中的值。检查此link 以了解每个的上限和下限。
【讨论】:
谢谢。你的回答有帮助。我根。使用 phpMyAdmin。所以我将从属性下拉选项创建无符号。【参考方案3】:有符号和无符号的范围相同,都是关于优化的。 unsigned 仅用于上限意味着它不允许负数。因此,当您知道只需要正数时,请始终使用无符号数。
查看here
【讨论】:
"所以当你知道你只需要正数时,总是使用无符号数。"这部分有帮助...谢谢。以上是关于MySQL 数据类型 - 有符号无符号的主要内容,如果未能解决你的问题,请参考以下文章