CREATE TABLE `foo` (
`b` bool DEFAULT '1', /* this is a synonym for TINYINT(1) */
`ti` tinyint DEFAULT '1',
`tiu` tinyint unsigned DEFAULT '1',
`si` smallintDEFAULT '1',
`siu` smallint unsigned DEFAULT '1',
`i` int DEFAULT '1',
`iu` int unsigned DEFAULT '1',
`bi` bigint DEFAULT '1',
`biu` bigint unsigned DEFAULT '1'
);
INSERT INTO foo () VALUES ();
然后我调用了一些jdbc代码并使用 getObject() 并要求它告诉我它返回的数据类型:
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT * FROM foo");
while (rs.next()) {
Object b = rs.getObject("b");
System.out.println("b ("+b.getClass().getSimpleName()+"):\t" + b);
Object ti = rs.getObject("ti");
System.out.println("ti ("+ti.getClass().getSimpleName()+"):\t" + ti);
Object tiu = rs.getObject("tiu");
System.out.println("tiu ("+tiu.getClass().getSimpleName()+"):\t" + tiu);
Object si = rs.getObject("si");
System.out.println("si ("+si.getClass().getSimpleName()+"):\t" + si);
Object siu = rs.getObject("siu");
System.out.println("siu ("+siu.getClass().getSimpleName()+"):\t" + siu);
Object i = rs.getObject("i");
System.out.println("i ("+i.getClass().getSimpleName()+"):\t" + i);
Object iu = rs.getObject("iu");
System.out.println("iu ("+iu.getClass().getSimpleName()+"):\t" + iu);
Object bi = rs.getObject("bi");
System.out.println("bi ("+bi.getClass().getSimpleName()+"):\t" + bi);
Object biu = rs.getObject("biu");
System.out.println("biu ("+biu.getClass().getSimpleName()+"):\t" + biu);
}
输出:
b (Boolean): true
ti (Integer): 1
ti2 (Integer): 1
tiu (Integer): 1
si (Integer): 1
siu (Integer): 1
i (Integer): 1
iu (Long): 1
bi (Long): 1
biu (BigInteger): 1
3条答案
按热度按时间aiazj4mn1#
mysql没有本机布尔类型。
https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html 说:
布尔,布尔
这些类型是tinyint(1)的同义词。零值被认为是错误的。非零值被认为是真的:
这意味着“boolean”类型仍然是8位有符号整数,而
(1)
语法不是大小限制。它不会阻止列存储从-128到127的整数值。这取决于你是否要避免存储这些值。mysql还支持
BIT
数据类型:https://dev.mysql.com/doc/refman/5.7/en/bit-type.htmlmysql jdbc驱动程序
BIT(1)
转换为java.lang.boolean。看到了吗https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-type-conversions.html 用于jdbc数据类型Map。但是位数据类型在它的历史中有一些错误。我避免使用它。
不管怎样,如果这是你所希望的,bit可能不会节省任何空间。如果在表中连续定义了一组位列,那么它们将被紧凑地存储,每个字节最多8列。但最小存储空间仍然是1字节,因此如果有1位列,它仍然需要整个字节。
回答您的问题:
它不需要太多的代码来测试这一点。
我创建了一个测试表并在其中放置了一行值:
然后我调用了一些jdbc代码并使用
getObject()
并要求它告诉我它返回的数据类型:输出:
我正在用mysql连接器/j5.1.44进行测试。
看来
TINYINT(1)
是由jdbc驱动程序专门处理的。它会自动将其转换为java.lang.boolean。再一次,
TINYINT(1)
对mysql中可能值的范围没有实际影响。它是一个8位有符号整数类型。但是jdbc驱动程序有专门的代码来查找(1)
length选项,并将其用作建议,使其转换为java.lang.boolean。对于32位无符号int,java.lang.integer是可以的,然后它必须使用java.lang.long来处理无符号int,然后使用biginteger来处理无符号bigint。java整数类型不是无符号的,因此要处理无符号int或bigint的较大值,java必须使用较大的整数类型。
yduiuuwa2#
mysql使用
TINYINT(1)
要模仿布尔类型的行为,请确保使用TINYINT(1)
作为列的数据类型,而不是TINYINT
.或者,您可以使用
BOOL
或者BOOLEAN
它们都是TINYINT(1)
.类似地,值
TRUE
以及FALSE
只是1
以及0
,分别在mysql中。ifmq2ha23#
Boolean
以及TINYINT(1)
是同义词吗mysql
,这意味着您可以互换使用它们而不会产生任何问题。