MySQL 中的 unsigned 和 signed 是整数类型的属性,它们决定了整数类型可以存储的数据范围以及相应的存储和运算行为。以下是 MySQL 中无符号和有符号整数在存储和运算中的详细差异:
无符号整数(unsigned)
存储和范围
- 存储:无符号整数在 MySQL 中总是使用相同数量的字节来存储,比如
TINYINT总是占用 1 个字节。 - 范围:
TINYINT无符号的范围是 0 到 255(2^8 - 1),SMALLINT无符号的范围是 0 到 65535(2^16 - 1),MEDIUMINT无符号的范围是 0 到 16777215(2^24 - 1),INT无符号的范围是 0 到 4294967295(2^32 - 1),BIGINT无符号的范围是 0 到 18446744073709551615(2^64 - 1)。
运算
- 算术运算:无符号整数可以进行所有基本的算术运算,包括加法、减法、乘法和除法。
- 溢出:如果运算结果超出了无符号整数的范围,将会发生溢出,结果可能不会按照预期进行模运算处理。
示例
CREATE TABLE example (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
data INT UNSIGNED NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO example (data) VALUES (4294967295);
SELECT data + 1 FROM example;
在上面的示例中,我们插入了一个最大的无符号 INT 值,然后尝试将这个值加 1,将会发生溢出,因为 INT 的最大值已经达到。
有符号整数(signed)
存储和范围
- 存储:有符号整数在 MySQL 中使用相同数量的字节来存储,但是使用一个额外的位来表示符号(正数或负数)。
- 范围:
TINYINT有符号的范围是 -128 到 127(-2^7 到 2^7 - 1),SMALLINT有符号的范围是 -32768 到 32767(-2^15 到 2^15 - 1),MEDIUMINT有符号的范围是 -8388608 到 8388607(-2^23 到 2^23 - 1),INT有符号的范围是 -2147483648 到 2147483647(-2^31 到 2^31 - 1),BIGINT有符号的范围是 -9223372036854775808 到 9223372036854775807(-2^63 到 2^63 - 1)。
运算
- 算术运算:有符号整数也可以进行所有基本的算术运算,包括加法、减法、乘法和除法。
- 溢出:如果运算结果超出了有符号整数的范围,将会发生溢出,对于无符号整数来说,溢出结果会按照模运算处理;而对于有符号整数,结果可能为负数。
示例
CREATE TABLE example (
id INT NOT NULL AUTO_INCREMENT,
data INT NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO example (data) VALUES (-2147483648);
SELECT data - 1 FROM example;
在上面的示例中,我们插入了一个最小的有符号 INT 值,然后尝试将这个值减 1,将会得到 -2147483649,因为结果超出了有符号整数的范围。
总结
无符号整数和有符号整数在存储和运算上的主要区别在于:
- 存储范围:无符号整数可以存储更大范围的数值,但所有数值都是非负的。
- 符号表示:有符号整数可以存储负数,并且需要额外的位来表示符号。
- 溢出处理:无符号整数溢出时结果按照模运算处理,有符号整数则可能为负数。
选择无符号或有符号整数类型时,应根据实际的应用场景和需求来决定。