当我们在设计MySQL表时,常常会使用int类型作为列的数据类型,但是int还可以指定长度,比如int(1)和int(11)两种类型。在这里,我们来深入聊一聊它们之间的不同。
事实上,int(1)和int(11)在存储数据时并没有真正的差异,它们都占据四个字节的存储空间,存储的范围也一样。它们的唯一区别在于,int(1)在显示时会被截断成只显示一位数字,而int(11)则可以完整显示出所有的数字。
接下来,我们用一个简单的示例来说明int(1)的作用。
创建一个employee表,用int(1)作为员工性别的数据类型:
CREATE TABLE employee (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
gender int(1),
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
接下来插入一些员工信息:
INSERT INTO employee (name, gender) VALUES
('Tom', 1),
('Jerry', 0),
('Alice', 2);
接着我们查看表中的数据:
SELECT * FROM employee;
结果如下:
| id | name | gender |
|----|--------|--------|
| 1 | Tom | 1 |
| 2 | Jerry | 0 |
| 3 | Alice | 2 |
由于gender字段的数据类型是int(1),所以JDBC在插入数据时会把0和1都当作Boolean类型的数据,所以实际存储的值为0或1。这也是我们不建议使用int(1)作为Boolean类型的原因之一。
但是,当我们使用SQL语句查询时,MySQL会把gender字段的值自动转换成字符串类型,如果是0或1,会显示为'0'和'1',如果是其他值,则会显示为该值本身。
接下来我们用一个示例来说明int(11)的作用。
创建一个sales表,用int(11)作为订单金额的数据类型:
CREATE TABLE sales (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL,
amount int(11),
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
接下来插入一些订单数据:
INSERT INTO sales (name, amount) VALUES
('Tom', 80000),
('Jerry', 90000),
('Alice', 50000);
我们可以使用下面的SQL语句查询所有订单的金额:
SELECT * FROM sales;
结果如下:
| id | name | amount |
|----|--------|---------|
| 1 | Tom | 80000 |
| 2 | Jerry | 90000 |
| 3 | Alice | 50000 |
由于amount字段的数据类型是int(11),所以MySQL会把所有的数字都完整地显示出来。
根据上面的示例,我们得出以下结论:
希望本文能够对大家了解关于int数据类型的不同大小有一些帮助。