mysql不接受boolean作为其列数据类型

8nuwlpux  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(350)

我有一个java程序,它在mysql数据库中以两种状态存储数据。为此我想用 BOOLEAN . 但每当我进来 BOOLEAN 它要换成 TINYINT .
有没有其他方法可以在两种状态下存储数据?

aiazj4mn

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.html
mysql 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位列,它仍然需要整个字节。
回答您的问题:
它不需要太多的代码来测试这一点。
我创建了一个测试表并在其中放置了一行值:

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

我正在用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必须使用较大的整数类型。

yduiuuwa

yduiuuwa2#

mysql使用 TINYINT(1) 要模仿布尔类型的行为,请确保使用 TINYINT(1) 作为列的数据类型,而不是 TINYINT .
或者,您可以使用 BOOL 或者 BOOLEAN 它们都是 TINYINT(1) .
类似地,值 TRUE 以及 FALSE 只是 1 以及 0 ,分别在mysql中。

ifmq2ha2

ifmq2ha23#

Boolean 以及 TINYINT(1) 是同义词吗 mysql ,这意味着您可以互换使用它们而不会产生任何问题。

相关问题