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位代表SIGNEDUNSIGNED之间的0..127。但是当最高位是1时,这8位要么代表负数,要么代表更大的正数。

如果您愿意,您可以解释这 256 个值的含义为“红色”、“黄色”、“绿色”等。这正是不同数据类型所发生的情况:

ENUM('red', 'yellow', 'green')

另一种解释 8 位字节为您提供ASCII 字符。见CHARVARCHARTEXT

由于TINYINT 必须是SIGNEDUNSIGNED,您不能拥有一个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 数据类型 - 有符号无符号的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 数据类型 - 有符号无符号

mysql-数据类型

复习MySQL②数据类型及约束条件

mysql的基本数据类型

MYSQL数据库数据类型

MySQL数据类型