我们的数据库管理员非常守旧,认为在按位字段中存储多个值是诸如电子邮件验证和电话号码验证等问题的最佳解决方案。
所以我试图编写一个 MySQL 语句,它将验证状态解析为 bool 为更易于人类阅读的内容,但我在编写该语句时遇到困难。他也离开了 3 个月,所以我无法联系他。
以下是Users
表中用于电子邮件和移动验证的位标志的定义。
MiscFlags
是一个 NOT NULL BIT(8)
,默认为 b'0'
在深入研究我们的文档后,我发现了这些规则:
MiscFlags & 1 = 1 email has been verified
MiscFlags & 1 <> 1 email has not been verified
MiscFlags & 2 = 2 mobile has been verified
MiscFlags & 2 <> 2 mobile has not been verified
我的声明:
SELECT u.*,
u.MiscFlags & 1 = 1 AS EmailVerified,
u.MiscFlags & 2 = 2 AS MobilePhoneVerified
FROM Users u
WHERE u.id = 12345 LIMIT 1;
如果电子邮件经过验证,它应该输出 1
,我认为。我正在处理数百万条记录,因此我不确定对于那些没有经过验证的电子邮件但有经过验证的手机号码的人是否能得到正确的答案。
我的 SQL 语句有效吗?在庄园中存储这个以及可能的其他“ bool 值”是否存在问题? MySQL 可以索引这种类型的字段吗?
最佳答案
是的,这是一个有效的 SQL 语句。根据您的描述,我希望它会给您带来您正在寻找的结果。
否 MySQL 无法索引位字段。至少它不会像你想象的那样——你无法对单个位的选择建立索引。
但您并不是在搜索单个位域条件,而是通过其 id
搜索单行。我假设的 id 是主键,它是一个索引。一旦找到该行,就不需要另一个索引。每个验证位的投影只是针对单行的单个表达式的评估。
关于mysql - 从 MySQL 中的按位字段返回多本书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59649500/