有趣的是,布尔类型只是在SQL标准后期才引入,即SQL:1999 。 即使在今天,并非所有数据库本身都支持BOOLEAN
或BIT
类型。 最重要的是,我们仍然可以在Oracle中等待一段时间。 这是2002年以来关于该主题的“问汤姆”的观点: https : //asktom.oracle.com/pls/apex/f?p=100 :11:0 ::::: P11_QUESTION_ID: 6263249199595
甲骨文 为什么没有布尔值?
人们通过使用数字或字符串文字来解决此限制。 例如1 / 0
, Y / N
, T / F
或SQL标准'true' / 'false'
。
JDBC中的布尔值
从JDBC API的角度来看,可以通过PreparedStatement.setBoolean()
将布尔值设置为绑定值,也可以通过ResultSet.getBoolean()
和类似方法从结果集中ResultSet.getBoolean()
布尔值。 如果您的数据库支持布尔值,则Java boolean
类型可以很好地映射到SQL BOOLEAN
,即使Java的Boolean
包装器类型更适合尊重NULLs
。
但是,如果要将布尔值存储在INTEGER
, CHAR(1)
或VARCHAR(1)
列中,则在各种数据库中情况看起来会有所不同。 考虑以下示例:
CREATE TABLE booleans (val char(1)
);
然后,运行此Java程序(我们使用jOOQ保持简洁)
try {DSL.using(configuration).execute("insert into boolean (val) values (?)", true);
}
catch (Exception e) {e.printStackTrace();
}DSL.using(configuration).fetch("select * from booleans");
并非所有的数据库/ JDBC驱动程序都支持上述功能。 这些数据库将运行上述程序:
- 火鸟(插入“ Y”或“ N”)
- HSQLDB(插入“ 1”或“ 0”)
- IBM DB2(插入“ 1”或“ 0”)
- MariaDB(插入“ 1”或“ 0”)
- Microsoft Access(插入“ 1”或“ 0”)
- MySQL(插入'1'或'0')
- Oracle(插入“ 1”或“ 0”)
- SQL Server(插入“ 1”或“ 0”)
- Sybase(插入'1'或'0')
……而这些数据库将抛出异常:
- BR
- 德比
- H2
- 英格利斯
- PostgreSQL的
- SQLite的
SQL标准中的布尔值
值得一提的是,SQL标准在CAST()
函数的规范中指定了如何处理从boolean
到字符串的转换:
6.13 <cast specification>
[...]
10) If TD is fixed-length character string, then let LTD be the length in charactersof TD.
[...]
e) If SD is boolean, then
Case:
i) If SV is True and LTD is not less than 4, then TV is 'TRUE' extended on the right byLTD–4
s.
ii) If SV is False and LTD is not less than 5,then TV is 'FALSE' extended on the right byLTD–5 <space>s.
iii) Otherwise, an exception condition is raised: data exception — invalid charactervalue for cast.
因此,即使从历史的角度来看,应该接受1/0的行为,但大多数开放源代码数据库都显示了可以解释为“正确”的行为。 使用开放源代码测试数据库时,请注意此限制!
有关此数据库和H2数据库的更多信息,请参考H2用户组上的该线程 。
翻译自: https://www.javacodegeeks.com/2014/03/the-jdbc-boolean-compatibility-list.html