MySQL 中的“unsigned”是什么?
MySQL 中的“unsigned”是一个数据类型修饰符,可以用来修饰整数类型数据。在 MySQL 中,整数类型包括:TINYINT、SMALLINT、MEDIUMINT、INT 和 BIGINT,这些类型均可以被设置为 “unsigned”。
阅读更多:MySQL 教程
如何将整数类型设置为 “unsigned”
在 MySQL 中,设置整数类型为 “unsigned” 很简单,只需要在创建表时,在数据类型后添加关键字 “unsigned” 即可。示例如下:
CREATE TABLE test_table (
id INT UNSIGNED PRIMARY KEY,
age TINYINT UNSIGNED NOT NULL,
money BIGINT UNSIGNED
);
以上代码中,整数类型的数据加上 “unsigned” 关键字,表示它们的数据范围都是正整数,而没有负整数。如 TINYINT UNSIGNED 的数据范围为 0~255,而 TINYINT 的数据范围为 -128~127。
在添加数据时,也需要针对整数类型是 “unsigned” 进行特别处理,否则会出现数据插入错误。示例如下:
INSERT INTO test_table (id, age, money) VALUES (1, -10, 2000);
以上代码中,age 字段的数据类型是 TINYINT UNSIGNED,但是插入的数据是一个负整数 -10,会提示以下错误:
Error Code: 1264. Out of range value for column 'age' at row 1
这是因为 TINYINT UNSIGNED 只能存储 0~255 的正整数,而不能存储负数或超出范围的数。
“unsigned” 带来的好处
将整数类型设置为 “unsigned” 有许多好处,包括:
- 存储空间:当整数类型设为 “unsigned” 时,存储空间会减半。因为原来会使用一位来表示符号位,但是这位符号位是可推导的,并不需要存储。比如,当 INT 类型存储 -2147483648~2147483647 时,需要 4 字节,而 INT UNSIGNED 类型只需要 4 字节存储 0~4294967295 的范围。
-
数据范围:设置整数类型为 “unsigned” 可以将数据范围从原来的 -2^n~2^n-1 扩大到 0~2^n-1,从而可以存储更大的数据范围。
注意事项
- 如果设置整数类型为 “unsigned”,那么在进行各种计算时,也要注意整数溢出的问题。
SELECT 250 * 2;
以上代码中,如果 250 被定义为 TINYINT UNSIGNED 类型,则结果为 0,因为 TINYINT UNSIGNED 最大只能存放到 255,250 * 2 的结果是 500,超出了数据范围,会自动截断为 244。
- 当对整数类型做减法时,两边的整数类型要一致。
SELECT -1 + 10;
以上代码中,如果 -1 被定义为 TINYINT UNSIGNED 类型,则结果会出错,因为无法对无符号数做减法。正确写法如下:
SELECT 255 + (-1) + 10;
结论
在 MySQL 中,将整数类型设置为 “unsigned” 可以节省存储空间,并且扩大数据范围,但是要注意整数溢出和减法操作的问题,以避免错误发生。
极客笔记