提问人: 提问时间:11/14/2008 最后编辑:Peter Mortensen 更新时间:7/13/2021 访问量:1036318
用于存储布尔值的MySQL数据类型
Which MySQL data type to use for storing boolean values
问:
由于MySQL似乎没有任何“布尔”数据类型,那么您在MySQL中“滥用”哪种数据类型来存储真/假信息?
特别是在编写和读取 PHP 脚本的上下文中。
随着时间的流逝,我使用并看到了几种方法:
- tinyint、varchar 字段包含值 0/1,
- 包含字符串 '0'/'1' 或 'true'/'false' 的 varchar 字段
- 最后是包含两个选项“true”/“false”的枚举字段。
以上似乎都不是最佳选择。我倾向于使用 tinyint 0/1 变体,因为 PHP 中的自动类型转换非常简单地给了我布尔值。
那么你使用哪种数据类型呢?有没有我忽略的为布尔值设计的类型?您认为使用一种或另一种类型有什么优点/缺点吗?
答:
我使用 TINYINT(1) 在 Mysql 中存储布尔值。
我不知道使用这个有什么好处......但是如果我没记错的话,mysql 可以存储布尔值 (BOOL) 并将其存储为 tinyint(1)
http://dev.mysql.com/doc/refman/5.0/en/other-vendor-data-types.html
对于 MySQL 5.0.3 及更高版本,您可以使用 .手册说:BIT
从 MySQL 5.0.3 开始,BIT 数据类型用于存储位字段 值。BIT(M) 类型支持存储 M 位值。M 级范围 从 1 增加到 64
否则,根据 MySQL 手册,您可以使用 或 ,它们目前是 tinyint(1) 的别名:BOOL
BOOLEAN
Bool、Boolean:这些类型是 TINYINT(1) 的同义词。值 零被视为 false。非零 值被视为 true。
MySQL还指出:
我们打算实现完整的布尔值 类型处理,根据 标准 SQL,在未来的 MySQL 中 释放。
参考资料: http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html
评论
!$boolean
BOOL
并且是 的同义词。零是,其他任何东西都是。更多信息请点击此处。BOOLEAN
TINYINT(1)
false
true
评论
(1)
BIT
BIT(1)
TINYINT(1)
BIT
TINYINT
BIT
BIT
TINYINT
true
SELECT 'foo' AS bar FROM dual WHERE -7
WHERE 1/3
WHERE 0
WHERE 'foo'
'foo'
如果使用 BOOLEAN 类型,则将其别名为 TINYINT(1)。如果您想使用标准化的 SQL,并且不介意该字段可能包含超出范围的值(基本上任何不是 0 的值都将是“true”),这是最好的选择。
ENUM('False', 'True') 将允许您在 SQL 中使用字符串,MySQL 会根据指定枚举的顺序在内部将字段存储为整数,其中 'False'=0 和 'True'=1。
在 MySQL 5+ 中,您可以使用 BIT(1) 字段来指示 1 位数字类型。我不认为这实际上会占用更少的存储空间,但再次允许您将可能的值限制为 1 或 0。
以上所有存储都将使用大致相同的存储量,因此最好选择您认为最容易使用的存储空间。
评论
这个问题已经得到回答,但我想我会投入 0.02 美元。
我经常使用 , 其中 .CHAR(0)
'' == true and NULL == false
来自 MySQL 文档:
CHAR(0)
当你需要一个只能接受的柱子时,也相当不错 两个值:定义为仅占用一个值的列 位,并且只能接受值和(空字符串)。CHAR(0)
NULL
NULL
''
评论
''
null
在MySQL实现位数据类型之前,如果您的处理确实需要空间和/或时间,例如大容量事务,请创建一个为所有布尔变量调用的TINYINT字段,并在SQL查询中屏蔽和移动所需的布尔位。bit_flags
例如,如果最左边的位代表布尔值字段,而最右边的 7 位表示什么都没有,那么你的字段将等于 128(二进制 10000000)。屏蔽(隐藏)最右边的 7 位(使用按位运算符),并将第 8 位向右移动 7 个空格,最终得到 00000001。现在,整个数字(在本例中为 1)就是您的值。bit_flags
&
SELECT (t.bit_flags & 128) >> 7 AS myBool FROM myTable t;
if bit_flags = 128 ==> 1 (true)
if bit_flags = 0 ==> 0 (false)
您可以在测试时运行如下语句
SELECT (128 & 128) >> 7;
SELECT (0 & 128) >> 7;
等。
由于您有 8 位,因此您可能有一个字节的 8 个布尔变量。一些未来的程序员总是会使用接下来的七位,所以你必须屏蔽。不要只是转移,否则你将来会为自己和他人创造地狱。确保你让MySQL进行掩码和移位——这将比让Web脚本语言(PHP、ASP等)快得多。此外,请确保在字段的 MySQL 注释字段中放置注释。bit_flags
在实现此方法时,您会发现这些网站很有用:
评论
VARCHAR
仅当您有很多布尔字段时,Bit 才比各种字节选项(tinyint、enum、char(1))更有优势。一个位字段仍然占用一个完整的字节。两个位字段适合同一个字节。三、四、五、六、七、八。之后,他们开始填充下一个字节。最终,节省的成本非常小,您应该关注数千项其他优化。除非您正在处理大量数据,否则这几个字节加起来不会太多。如果你在PHP中使用bit,你需要对进出的值进行类型转换。
评论
这是一个优雅的解决方案,我非常欣赏,因为它使用零数据字节:
some_flag CHAR(0) DEFAULT NULL
要将其设置为 true,请设置,并将其设置为 false,请设置 。some_flag = ''
some_flag = NULL
然后,要测试 true,请检查是否some_flag,要测试 false,请检查 some_flag 。IS NOT NULL
IS NULL
(Jon Warren Lentz、Baron Schwartz 和 Arjen Lentz 的“High Performance MySQL: Optimization, Backups, Replication, and More”中对此方法进行了介绍。
评论
COMMENT
NULL
''
我厌倦了试图在 PHP、MySql 和 POST 值的循环中准确地获得零、NULLS 和 '',所以我只使用'Yes'和'No'。
这完美无缺,不需要特殊处理,既不明显也不容易做到。
评论
参考 Mysql 中的这个链接布尔数据类型,根据应用程序的使用情况,如果只想存储 0 或 1,bit(1) 是更好的选择。
评论
BIT(1)
b'0'
b'1'
BIT
TINYINT(1)
BIT
TINYINT
在阅读了这里的答案后,我决定使用它,是的,它在空间/时间上以某种方式更好,但过了一会儿我改变了主意,我再也不会使用它了。当使用准备好的语句、库等 (php) 时,它使我的开发变得复杂了很多。bit(1)
从那以后,我总是用,似乎已经足够好了。tinyint(1)
评论
由于 MySQL (8.0.16) 和 MariaDB (10.2.1) 都实现了 CHECK 约束,我现在将使用
bool_val TINYINT CHECK(bool_val IN(0,1))
您只能存储 、 或 ,以及可以转换为或不转换为错误(如 、 或 /)的值。0
1
NULL
0
1
'1'
0x00
b'1'
TRUE
FALSE
如果不想允许 NULL,请添加以下选项NOT NULL
bool_val TINYINT NOT NULL CHECK(bool_val IN(0,1))
请注意,如果使用 ,则几乎没有区别。TINYINT
TINYINT(1)
TINYINT(123)
如果希望架构向上兼容,还可以使用 或BOOL
BOOLEAN
bool_val BOOL CHECK(bool_val IN(TRUE,FALSE))
评论
ENUM
enum('0', '1')
0
FALSE
1
TRUE
'0'
2
'1'
您可以使用 BOOL(BOOLEAN 数据类型)来存储布尔值。
这些类型是 TINYINT(1) 的同义词
然而, BIT(1) 数据类型更适合存储布尔值(true[1] 或 false[0]),但 TINYINT(1) 在输出数据、查询等操作时更容易使用,并实现 MySQL 和其他数据库之间的互操作性。您也可以查看此答案或主题。
MySQL 还将 BOOL、BOOLEAN 数据类型转换为 TINYINT(1)。
此外,请阅读文档
评论
bit(1)
有点**在Excel中导入。切换到工作。tinyint(1)