tinyint 类型
从 -2^7(-128) 到 2^7 - 1 (127) 的整型数据。
存储大小为 **1** 个字节,对应 Java 的 byte。
无符号(unsigned)形式的范围是从 0 到 255 的整型数据。
所以建表的时候只能是 tinyint(3),哪怕你建 tinyint(100),他最大还是3位这么多。
smallint 类型
从 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型数据。
存储大小为 **2** 个字节,对应 Java 的 short。
无符号(unsigned)形式的范围是从 0 到 65535 的整型数据。
所以建表的时候只能是 smallint(5),哪怕你建 smallint(100) ,他最大还是5位这么多。
int 类型
从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据。
存储大小为 **4** 个字节,对应 Java 的 int。
无符号(unsigned)形式的范围是从 0 到 4294967296 的整型数据。
所以建表的时候只能是 int(10),哪怕你建 int(100),他最大还是10位这么多。
bigint 类型
从 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807) 的整型数据(所有数字)。
存储大小为 **8** 个字节,对应 Java 的 Long。
无符号(unsigned)形式的范围是是……(自己算吧)
所以建表的时候只能是 bigint(20), 哪怕你建 bigint(100),他最大还是20位这么多.
选择合适的存储类型
另外,建表示应使用合适的存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。
示例:如下表,其中无符号值可以避免误存负数,且扩大了表示范围。
| 对象 | 年龄区间 | 类型 | 字节 | 表示范围 |
|---|---|---|---|---|
| 人 | 150 岁之内 | unsigned tinyint |
1 | 无符号值:0 到 255 |
| 龟 | 数百岁 | unsigned smallint |
2 | 无符号值:0 到 65535 |
| 恐龙化石 | 数千万年 | unsigned int |
4 | 无符号值:0 到约 42.9 亿 |
| 太阳 | 约 50 亿年 | unsigned bigint |
8 | 无符号值:0 到约 10 的 19 次方 |
在建表时经常使用数据类型 unsigned tinyint(1) 进行表示某些状态,如:is_deleted。
但是,在使用 Mybatis Generator 转 JAVA 类型时经常会被转换为 Boolean 。在某些情况下不符合我们的预期,为此我们可以在设置 jdbc 连接时指定配置:
tinyInt1isBit=false 参数(注意区分大消息,否则不生效),示例:
jdbc:mysql://${host}:{port}/${db.mysql.db}?tinyInt1isBit=false
有关更多的配置可以在 MySQL 官网文档中查阅:
https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-configuration-properties.html
