Mysql:如何查询类型为位的列?

Posted

技术标签:

【中文标题】Mysql:如何查询类型为位的列?【英文标题】:Mysql: How to query a column whose type is bit? 【发布时间】:2010-10-24 18:52:27 【问题描述】:

您好,我正在使用休眠和 mysql。我有一个带有布尔属性的类,称为“活动”。

生成的数据库表具有 BIT 数据类型。到目前为止,一切都很好。 我想查询这个值,但我不知道该怎么做。 我试过了

 SELECT * from table where active = 1

不起作用,以下也不起作用

 SELECT * from table where active = true

我在参考手册和 Stackoveflow 都没有找到任何东西。

有什么提示吗?

提前致谢!

【问题讨论】:

【参考方案1】:
SELECT * FROM table WHERE active = (1)

【讨论】:

【参考方案2】:

根据this page,对于5.0.3 之前的版本,BIT 是TINYINT(1) 的同义词。

你试过这些吗?

SELECT * from table where active = (1)
SELECT * from table where active = 'true'
SELECT * from table where active = b'1'

blog entry 建议完全避免使用 BIT 数据类型。

【讨论】:

第一个和第三个条目是 coorect 而第二个不起作用,至少在我的 Mysql 安装下。还是谢谢。 @Andomar 不同意避免使用 BIT 数据类型。缺点是与旧版本的互操作性,假设你不需要它,BIT实际上存储数据更紧凑,从而节省存储空间。 @Pacerier 我不明白 BIT 如何节省存储空间。 TINYINT(1) UNSIGNED 1 个字节和 BIT(1) 1 个字节。见dev.mysql.com/doc/refman/8.0/en/storage-requirements.html(与5.7相同)【参考方案3】:

要指定位值,可以使用 b'value' 表示法。

【讨论】:

@Alvaro:这个问题差不多4岁了!【参考方案4】:

其实 MySQL 有内置的位字面量:

select*from table where active = 0b1

【讨论】:

【参考方案5】:

您是否尝试将其转换为整数进行比较

SELECT * from table where cast(active as unsigned) = 1

我大部分时间都使用 MS SQL,如果这不起作用,请原谅我,因为我无法测试它。

【讨论】:

【参考方案6】:

嗯,对于比较和更新,0 和 1 对我有用:

这里有一个bit(1)类型的字段,一行,该字段当前为假:

mysql> select isfeatured from nodes where isfeatured = 1;
Empty set (0.00 sec)

mysql> select isfeatured from nodes where isfeatured = 0;
+------------+
| isfeatured |
+------------+
|            |
+------------+
1 row in set (0.00 sec)

更新将isfeatured中的0改为1,即bit(1)类型...

mysql> update nodes set isfeatured=1 where isfeatured = 0;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1  Changed: 1  Warnings: 0

改变了一行...再试一次:

mysql> update nodes set isfeatured=1 where isfeatured = 0;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0

没有按预期更改任何行。

与以前相同的选择查询:

mysql> select isfeatured from nodes where isfeatured = 1;
+------------+
| isfeatured |
+------------+
|           |
+------------+
1 row in set (0.00 sec)

mysql> select isfeatured from nodes where isfeatured = 0;
Empty set (0.01 sec)

看,它有效。

我正在使用:

mysql Ver 14.14 Distrib 5.5.31,适用于使用 readline 6.2 的 debian-linux-gnu (x86_64)

/usr/sbin/mysqld Ver 5.5.31-0+wheezy1 用于 x86_64 上的 debian-linux-gnu ((Debian))

【讨论】:

以上是关于Mysql:如何查询类型为位的列?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 错误代码:1264。第 1 行的列 'columnname' 的值超出范围

MySQL - 如何将子查询中的列别名用于另一个子查询?

MYSQL如何查询表中字段类型TYPE=date的字段信息?

如何使用两个不同的列 mySQL 从查询而不是其他查询中获取数据? [复制]

如何在 mySQL 查询中显示额外的列

SQLAlchemy 获取查询结果的列数据类型