1、如上文所说,在JDBC代码中,tinyint(1)和bit(1)都可以作为boolean 类型的表达,mysql中默认是tinyint(1)。
2、tinyint中M只是针对zerofill情况下具有意义,对tinyint的存储范围不影响。bit中M的大小,对bit的存储范围是具有直接影响的。
3、tinyint是数值类型,存储较小的数值, 一般对应编辑语言里的小字典或枚举类型. 节省空间的同时, 避免存入超范围的值.
4、bit类似多用于存储状态. 如bit(1) 直接对应Java语言的布尔类型true和false. 如下图可见,bit在mysql数据库中以二进制的形式存储,更符合boolean类型的语义。用做状态保存时一个字段可以保存多至64个状态.
5、JDBC代码中,tinyint(1)和bit(1)在getInt()情况下,正常显示数值。
三、tinyint被转换成boolean类型的解决方案
1、推荐无特殊需求,设置tinyint(4)
2、在jdbcUrl中添加参数:tinyInt1isBit=false
四、boolean到底采用tinyint(1)还是bit(1)?
就我个人观点而言,tinyint(1)存储空间是一个字节,也就是8个bit,占用的空间更多。而bit(1)是位数据类型,只占用一个bit。bit(1)作为boolean类型更佳。
五、相关代码
创建数据库:
CREATE TABLE `test`(
`id` bigint(20) NOT NULL,
`tin_yint` tinyint(1) NOT NULL DEFAULT '2',
`bi_t` bit(1) NOT NULL DEFAULT b'0'
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='测试表';
JDBC代码:
package com.xxkj;
import java.sql.*;
import java.util.Properties;
public class Test {
public static void main(String[] args) throws Exception {
Connection connection = getConnection();
PreparedStatement pstmt = connection.prepareStatement("select id, tin_yint,bi_t from test ");
ResultSet rs = pstmt.executeQuery();
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
for (int i = 0; i < columnCount; i++) {
System.out.println("第" + i + "列type:" + metaData.getColumnTypeName(i + 1));
while (rs.next()) {
System.out.println("id:" + rs.getObject(1) + " 第二列Tinyint(1)ToObj:" + rs.getObject(2) + " 第三列Bit(1)ToObj:" + rs.getObject(3));
connection.close();
public static Connection getConnection() {
Connection conn = null;
try {
Driver driver = new com.mysql.cj.jdbc.Driver();
String url = "jdbc:mysql://localhost:3306/GiftManagement?tinyInt1isBit=false";
Properties info = new Properties();
info.setProperty("user", "root");
info.setProperty("password", "001122");
conn = driver.connect(url, info);
} catch (Exception e) {
e.printStackTrace();
return conn;
复制代码