在设计数据库时,存储多个真/假值的首选方法是什么?

rjz*_*zii 13 sql-server oracle database-design query-optimization

正如标题中所述,在设计数据库时,处理具有多个列的表的首选方法是什么,这些列只是将true/false值存储为单个或者值(例如"Y/N:或"0/1") )?同样,是否存在可能影响列处理方式的不同数据库(例如Oracle和SQL Server)之间可能出现的问题?

Qua*_*noi 14

SQL Server,有BIT数据类型.您可以在那里存储0或1,比较值但不运行MINMAX.

Oracle,你只需使用NUMBERCHAR(1).

In MySQLPostgreSQL任何数据类型都可以隐式转换为BOOLEAN.

两个系统都支持BOOLEAN数据类型,您可以在WHEREor ON子句中使用不带运算符的情况:

SELECT  *
FROM    mytable
WHERE   col1
Run Code Online (Sandbox Code Playgroud)

,这是不可能的SQL ServerOracle(你需要有某种形式的谓语那里).

MySQL,BOOLEAN是的同义词TINYINT(1).

PostgreSQL太(在存储方面),但在逻辑上,它不隐式转换为任何其他类型.

  • 一个补充:如果在SQL Server的表中使用多个BIT列,它会将它们组合在一起.例如,如果您有一个BIT列,它将使用1个字节的存储空间.但是,如果你有8个BIT列,它仍然会使用1个字节来存储它们.另一方面,Oracle为每个分配1个字节. (7认同)
  • @Rob:我会避开那些"1"和"0"对于调试目的来说不够人性化的开发人员. (3认同)

Yad*_*ada 5

根据我自己的经验,我更喜欢char(1)代表'Y'或'N'.使用0和1可能会有点混乱,这取决于我已经喝了多少啤酒,C++ main()函数在成功时返回0.ENUM和BIT类型比它们的价值更麻烦.

有趣的是,MySQL information_schema使用VARCHAR(3)表示"是"或"否".

例:

information_schema.USER_PRIVILEGES (
  ...
  IS_GRANTABLE VARCHAR(3) NOT NULL DEFAULT ''
) 
Run Code Online (Sandbox Code Playgroud)

  • 坦率地说,我不鼓励使用ENUM('Y','N'),因为它们在其他编程语言中都转换为1/true.如果使用0和1,即使它只是ENUM(1,0)而不是BIT/BOOLEAN,那么0将在Perl,PHP等"软"语言中转换为false .0和1是经典的表示方式布尔值,将由大多数编程语言准确解释. (5认同)