MySQL的最小整数类型TINYINT介绍

发布时间 2023-07-10 16:56:16作者: 夏威夷8080

MySQL的最小整数类型TINYINT介绍

在MySQL中,TINYINT是一种整数数据类型,用于存储小范围的整数值。它可以存储范围在-128到127之间的有符号值,或者范围在0到255之间的无符号值,具体取决于列的定义方式。TINYINT类型通常用于保存布尔值(0或1),或者存储较小的整数数据。在数据库中,TINYINT类型只占用1字节的存储空间。

要定义一个无符号的TINYINT列,可以使用以下SQL语句:

CREATE TABLE 表名 (
    列名 TINYINT UNSIGNED,
    ...
);

要定义一个有符号的TINYINT列,可以使用以下SQL语句:

CREATE TABLE 表名 (
    列名 TINYINT,
    ...
);

为什么TINYINT的取值范围是-128到127的有符号值或0到255之间的无符号值

对于有符号的TINYINT类型来说,取值范围为-128到127,或者无符号的取值范围为0到255。这是因为TINYINT使用一个字节(8位)来存储数据,其中1位被用作符号位(表示正负),而剩下的7位用于表示数值。

在有符号的TINYINT中,最高位被用作符号位,0表示正数,1表示负数。剩下的7位用于存储实际的数值。根据二进制补码表示法,有符号的TINYINT可以表示的范围是从-2^7 (-128) 到 2^7-1 (127)。

由于有符号TINYINT包括了0和负数在内,所以其取值范围是从-128到127。其中,-128用二进制表示为10000000,而127用二进制表示为01111111。

需要注意的是,如果将有符号的TINYINT类型的列定义为无符号,那么它将能够表示的范围是0到255,而不是-128到127。无符号的TINYINT类型的所有8位都用于表示数值,没有符号位。

往一个定义为无符号的tinyint类型的列里插入了一个300的值,会发生什么?

如果一个列定义为无符号的TINYINT类型,并且尝试插入一个大于255的值(比如300),将会发生以下情况:

  1. 截断:MySQL会截断这个值,只保留最低有效位。对于无符号的TINYINT类型,只有8位用于存储数据,取值范围是0到255。如果插入的值超过了该范围,MySQL会自动将其截断,保留最低的8位。

    例如,插入的值为300,转换成二进制后为100101100。由于只有右边的8位是有效的,MySQL会将其截断为01100100,对应的十进制值是100。

  2. 警告:MySQL会生成一个警告(warning)来提示数据被截断。这是为了让开发者注意到插入的值超出了有效范围,并可以及时修正。

虽然MySQL会进行截断处理,但是建议在设计数据库时遵循数据类型的规范,确保插入的数据不会超出预期的取值范围。这有助于数据的完整性和一致性,避免出现意外的结果或错误。

假设user表里的age是TINYINT类型,下面这条sql会发生什么?

SELECT * FROM `user` WHERE age > '11';

在执行这条SQL语句时,会发生隐式的类型转换。由于字符串常量'11'被与TINYINT类型的age列进行比较,数据库系统会尝试将字符串转换为数值类型进行比较。

根据MySQL的隐式类型转换规则,字符串会被转换为对应的数值类型。在这种情况下,字符串'11'会被转换为整数类型,因为age列是TINYINT类型(整数类型)。

如果age列的实际值大于11(整数),则该行将被检索出来。否则,该行不会被包含在结果中。

需要注意的是,隐式类型转换可能导致意外结果或不一致的行为。为了确保准确的比较,建议使用正确的数据类型进行比较,避免依赖隐式类型转换。在此例中,可以将比较值改为11(整数)而不是字符串'11',以确保正确的比较操作。

SELECT * FROM `user` WHERE age > 11;