MYSQL布尔类型

时间:2017-03-23 21:00:45

标签: mysql boolean

有人可以确认我对布尔的看法是否正确?

  1. 表格中没有布尔类型。相反,mysql使用数字类型。
  2. mysql程序中有一个boolean类型。
  3. 所以如果你用BOOL列创建一个表,mysql将只使用TINYINT(1),你可以插入TRUE或1,两者都会有相同的结果。

    但是如果你使用只接受布尔类型作为参数的运算符或函数,如运算符“IS”(IS boolean_value),你必须使用TRUE,FALSE(甚至UNKNOWN)!你不能以1为参数!

    选择1 IS 1; #syntax错误

    选择1 IS TRUE; #return 1

    是吗?

1 个答案:

答案 0 :(得分:2)

这归结为 sql standard 中的一些定义。

sql标准将真值定义为TRUE | FALSE | UNKNOWN

IS - 运算符是针对以下两种情况定义的:

  • 布尔测试:<boolean primary> [ IS [ NOT ] <truth value> ](布尔主要是可以计算为布尔值的东西)
  • null - 值的测试:<rowvalue> IS NULL

因此IS的正确语法要求后跟真值(所以单词TRUEFALSE或{{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 datatypeIS NULL的同义词。

因此,如果您可以使用IS前面的TINYINT(1)(需要布尔表达式)将取决于数据库系统。 MySQL允许你使用1,PostgreSQL没有(但允许IS),而MSSQL甚至不支持1