有人可以确认我对布尔的看法是否正确?
所以如果你用BOOL列创建一个表,mysql将只使用TINYINT(1),你可以插入TRUE或1,两者都会有相同的结果。
但是如果你使用只接受布尔类型作为参数的运算符或函数,如运算符“IS”(IS boolean_value),你必须使用TRUE,FALSE(甚至UNKNOWN)!你不能以1为参数!
选择1 IS 1; #syntax错误
选择1 IS TRUE; #return 1
是吗?
答案 0 :(得分:2)
这归结为 sql standard 中的一些定义。
sql标准将真值定义为TRUE | FALSE | UNKNOWN
。
IS
- 运算符是针对以下两种情况定义的:
<boolean primary> [ IS [ NOT ] <truth value> ]
(布尔主要是可以计算为布尔值的东西)null
- 值的测试:<rowvalue> IS NULL
因此IS
的正确语法要求后跟真值(所以单词TRUE
,FALSE
或{{1} })或UNKNOWN
。例如。也不允许NULL
,因为select 1 IS (1=1);
的结果是布尔值,而不是真值。
对于支持(1=1)
的任何数据库系统(如果它不想违反 sql标准),都是如此。所以你不能使用IS
之后的4个单词之一的原因仅仅是语法禁止它,并且还不能表明如何实现布尔值。因为IS
在布尔测试中是可选的,所以剩下的主要目的是测试IS
- 值,因此除了null
之外,您通常不需要使用{{ 1}}。
通常,如果函数需要特定的数据类型(例如布尔值),则必须提供该数据类型。但是根据数据库系统,可能会有自动类型转换。虽然一些数据库系统确实有单独的布尔数据类型,MySQL implements 1 | 0 | null
作为布尔表达式的结果(根据定义,它是一个布尔值):
在SQL中,所有逻辑运算符的计算结果为TRUE,FALSE或NULL(UNKNOWN)。在MySQL中,这些实现为1(TRUE),0(FALSE)和NULL。 [...] MySQL将任何非零非NULL值评估为TRUE。
并且在使用布尔值的地方使用它,例如comparison operators,如果需要,甚至可以正确投射:
比较操作导致值为1(TRUE),0(FALSE)或NULL。这些操作适用于数字和字符串。根据需要,字符串会自动转换为数字和数字。
相反,对于MySQL,boolean datatype是IS NULL
的同义词。
因此,如果您可以使用IS
前面的TINYINT(1)
(需要布尔表达式)将取决于数据库系统。 MySQL允许你使用1
,PostgreSQL没有(但允许IS
),而MSSQL甚至不支持1
。