我想在MySQL数据库中保存true/false
。我将1
/ 0
保存在INT
列中以执行此操作。当我select
时,我会收到1
或0
,但我希望它将true
/ false
返回给我的PHP代码,而不必重写数据库。
我可以使用其他列类型吗?我应该以不同方式保存吗?
更新:我的问题是不想重写返回的值。我从我的数据库中获得了很多结果。其中许多是真/假,但有些是0,因为价格是0,所以我不想普遍重写所有的1和0。我也不想手动重写10列。
答案 0 :(得分:3)
要跟进我的评论,这里有一个更详细的回复,也涵盖了PHP方面,虽然这可能属于StackOverflow。
我一直只使用tinyint
,但您可以使用bool
/ boolean
作为tinyint(1)
的同义词
但是,从MySQL 5.0.3开始,您可以使用the bit
type:
从MySQL 5.0.3开始,BIT数据类型用于存储位字段值。一种BIT(M)允许存储M位值。 M可以在1到64之间。
接下来,假设您有一个active
列,如果用户处于活动状态可能存储,您可以使用PHP的自动类型转换来非常简单地处理它。
// Obviously you'd replace this with your database call
$results = [['active' => 1], ['active' => 0]];
foreach($results as $row) {
if ($row['active'] == true) {
echo "true\n";
}
else {
echo "false\n";
}
}
答案 1 :(得分:2)
您不需要做任何事情。
PHP不会,也不能使用强类型变量。因此,如果您从查询结果中收到(int) 1
,则只需将此1
用作布尔值,而无需重写或更改任何内容。
$intOne = (int) 1; //explicitly treat the variable as an integer
var_dump((bool) $intOne); //treat the variable as a boolean
当在任何布尔上下文中使用时,如if ($variable)...
,那么PHP中的任何类型都将被视为false
:
- 布尔值FALSE本身
- 整数0(零)
- 浮点数0.0(零)
- 空字符串,字符串“0”
- 包含零元素的数组
- 一个零成员变量的对象(仅限PHP 4)
- 特殊类型NULL(包括未设置的变量)
- 从空标签创建的SimpleXML对象
......最重要的是,
其他每个值都被视为TRUE(包括任何资源)。
来源:PHP Manual > Booleans (english)
因此,虽然您可以在mysql中更改列的存储类型,但这并不会真正改变PHP处理从结果中检索到的变量的方式。
从历史上看,我总是使用类型TINYINT(1)
的列来在mysql中存储布尔值,正如Tom Green指出的那样,最近的mysql版本提供了一种新的BIT
类型,这可能是合适的。据我所知,mysql目前没有实际的布尔数据类型。
你可以轻松地使用VARCHAR(1)
类型的列,因为PHP可以并且将使用任何值作为布尔值,这要归功于光荣,雄伟,有时令人发狂的PHP Type Juggling。
如果你正在尝试使用你正在检索布尔逻辑的值,只需使用你从mysql收到的值,比如布尔值,它就会起作用:
if ($valueFromResults) {
//The value was something like true
} else {
//The value was something like false
}
如果你试图真实地回应“真实”和“虚假”这两个词,那么你可能最好通过明确回应你自己的话来做到这一点,就像这样;
if ($valueFromResults) {
echo "true";
} else {
echo "false";
}
或者,用我喜欢的速记;
echo ($valueFromResults) ? "true" : "false" ;
更新您在评论中提到要通过json_encode()
传递值并在javascript中使用它们。
JavaScript会将任何实际值(如int 1
)视为true
,将任何空值(如int 0
)或空字符串视为false
。因此,如果您的json_encode()
输出在实际JavaScript中使用,则int值仍将作为布尔值使用。因此,数据库中的整数值仍应按原样运行。
只需检查您的整数结果是否由PHP编码为整数而不是字符串 - 默认情况下它们应该正确编码 - 因为"0" == true
在javascript中,但是0 == false
。
答案 2 :(得分:1)
对于布尔值(true / false),您应该使用mySql类型bit
或tinyint(1)
。
$boolean = $mysql_data ? true : false;