我正在考虑将用户的状态保存为整数,因此它可以有9种不同的状态,每种状态有10种类型。 (#########)
例如,未付款和注册的注册用户。状态= 000011200。
我可以使用MySQL搜索具有状态的用户,例如#########?
答案 0 :(得分:2)
这听起来像是一个几乎不可能维护的想法。是的,它是紧凑的,但它对人类来说是不可理解的,这使得它很难使用。它也远不能自我记录;如果你忘记或混淆了哪个数字代表了你将遇到的大量问题和逻辑错误。
您应该将每种单独的状态存储在一个单独的列中,并且最好使用像ENUM那样自我记录的值作为值:
CREATE TABLE foo (
payment_status ENUM('paid', 'pending', 'rejected'),
registration_status ENUM('active', 'pending', 'deleted'),
...
)
清洁,简单,易于理解,可用,可维护,可扩展;可能还有其他一些*更多。我没有看到使用其他东西的任何真正优势。
答案 1 :(得分:0)
使用/100
删除最后两位数字,只使用modulo 10
运算符的最后一位数字
select (status / 100) % 10
from your_table
答案 2 :(得分:0)
您可以将整数转换为char,然后使用带下划线的LIKE运算符作为单个通配符。
CAST(status as CHAR(9)) LIKE '______2__'
但我相信您可以找到更好的数据库设计来实现这一目标。
在您打算使用的设计中,不能使用索引标准示例。
如果要存储两种不同类型的信息,请将其存储在两个不同的列中。您将拥有一个更容易维护的数据库。
答案 3 :(得分:0)
在PHP中:
$n = 123456;
$digit = 5-1 //display 5th digit
echo substr($n,$digit,1);
在MySQL中:
select * from table where status like '____2%'
这将选择所有记录,其中2位于第5位......
但我宁愿使用int作为记录类型和2的权限...它更快更简单...
让我们说你有4个属性...所以2个2的幂是1,2,4,8 ...如果你想将第二个属性标记为活动你只需将值设置为2 ......但是当你想要要将第2和第4个值设置为有效,只需将值设置为2 | 4
(insert into table (status) values (2 | 4)
)...现在您可以读取所有包含select * from table where (status & 2) and (status & 4)
答案 4 :(得分:0)
虽然这只是帮助宣传一个糟糕的设计,如果你想检查任何特定的数字,那么treat the number as a string:
SELECT ...
...
WHERE SUBSTR(status, 7, 1) = '2'
答案 5 :(得分:0)
CREATE TABLE IF NOT EXISTS `test` (
`id` int(10) unsigned NOT NULL auto_increment,
`user_id` int(10) unsigned NOT NULL,
`status` int(9) unsigned zerofill NOT NULL,
PRIMARY KEY (`id`),
KEY `status` (`status`)
)
使用SUBSTR
SELECT * FROM `test`
WHERE SUBSTR(
STATUS , 7, 1 ) = '2'
使用REGXP
SELECT *
FROM `test`
WHERE
STATUS REGEXP '[0-9]{6}2'