当我们在设计MySQL表时,常常会使用int类型作为列的数据类型,但是int还可以指定长度,比如int(1)和int(11)两种类型。在这里,我们来深入聊一聊它们之间的不同。
int(1)与int(11)的区别
事实上,int(1)和int(11)在存储数据时并没有真正的差异,它们都占据四个字节的存储空间,存储的范围也一样。它们的唯一区别在于,int(1)在显示时会被截断成只显示一位数字,而int(11)则可以完整显示出所有的数字。
int(1)的示例
接下来,我们用一个简单的示例来说明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)示例
接下来我们用一个示例来说明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(1)在存储时和int(11)没有实际区别,它们占用的存储空间是一样的;
- int(1)可以被当做Boolean类型来使用,但要注意在查询时可能会出现一些问题;
- int(11)在存储数值时可以完整显示出所有的数字,比如订单金额等需要精确到分的数字,适合使用int(11)。
希望本文能够对大家了解关于int数据类型的不同大小有一些帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详细深入聊一聊Mysql中的int(1)和int(11) - Python技术站