0

我有表:

+----------------+--------------+
| name (varchar) | flags (text) |
+----------------+--------------+
| A              | 100001000000 |
| B              | 100001000000 |
| C              | 000001000000 |
| D              | 000001000000 |
+----------------+--------------+

Flags将超过 64 位的二进制值存储为 TEXT。

我想要做:

SELECT name, conv(flags, 2, 2) & conv('100000000001', 2, 2) FROM users; 

哪个应该返回:

+----------------+--------------+
| name (varchar) | flags (text) |
+----------------+--------------+
| A              | 1            |
| B              | 1            |
| C              | 0            |
| D              | 0            |
+----------------+--------------+

但是当flag > 2^64-1我得到总是1因为conv总是返回2^64-1

我该如何解决这个问题?

4

2 回答 2

-1

你不能。CPU 在 32/64 位模式下工作。& 是一个高级运算符,它将被转换为一个低级程序集“AND”(CPU 指令)

所以像 & ~ << >> .... 这样的按位运算符总是限制为 32/64 位。在 MySQL 中,按位运算符仅限于 64 位,MySQL 中的 VM(虚拟机)将进行转换,因此按位运算符也可以在 32 位系统上运行,但它应该比 64 位系统慢,因为需要更多指令。

如果你想在你的应用程序中处理标志,但在那里等待同样的问题,所以重新考虑你的想法和结构。

于 2013-08-23T09:49:04.967 回答
-1

可能会有所帮助......我没有特别详细地阅读整个内容,但想法是这样的:

创建一个代表所有可能的掩码值的数字表。将您的掩码存储为字符串,并一次将其与您的数字表子字符串进行比较。

这可能不是一个很好的解释,所以我鼓励您阅读链接。 是有关使用同一作者的数字表的更多信息。

于 2014-05-23T14:36:03.093 回答