Php MySQL布尔类型
我真的很不知道该怎么办。在过去的10年里,我一直在忍受这一点,但我认为是时候决定正确的方式来处理这个问题了 根据互联网,MySQL不支持本机数据类型,这就是为什么每当我选择“BOOLEAN”时,我都会看到列以tinyint结尾(1) 我可以将数据存储为一个带有1或0值的tinyint,但我确实有一个问题,即当我使用此列从数据库中选择许多行时,会得到一个字符串“1”或“0”,而不是PHP本机bool true/false。当然,PHP仍然可以将这个变量作为布尔值处理,因为每当我执行==0或==1,甚至=='0'或=='1'时,它似乎会自动知道我希望它做什么,如果我真的感到满意的话 所以,我现在开始,将这些数据运行到PHP的Php MySQL布尔类型,php,mysql,codeigniter,handlebars.js,Php,Mysql,Codeigniter,Handlebars.js,我真的很不知道该怎么办。在过去的10年里,我一直在忍受这一点,但我认为是时候决定正确的方式来处理这个问题了 根据互联网,MySQL不支持本机数据类型,这就是为什么每当我选择“BOOLEAN”时,我都会看到列以tinyint结尾(1) 我可以将数据存储为一个带有1或0值的tinyint,但我确实有一个问题,即当我使用此列从数据库中选择许多行时,会得到一个字符串“1”或“0”,而不是PHP本机bool true/false。当然,PHP仍然可以将这个变量作为布尔值处理,因为每当我执行==0或==1,
json_encode
函数中,当我的主干/把手实现进行ajax调用时输出它,并得到一个漂亮的json对象(通常包含许多行的数据):{“myVariable”:“1”}
或这个{“myVariable”:“0”}
我相信您可以在handlebar.js中看到这样做的问题:
{{#if myVariable}}
Do this
{{else}}
Do that
{{/if}}
现在,我真的不想做这样的事情:
<?php
for($i = 0; $i < count($recordSet); $i++) {
$recordSet[$i]['myVariable'] = (bool)$recordSet[$i]['myVariable'];
}
?>
有更好的办法吗?我正在使用代码点火器。。。可以通过某种方式修改数据库类来检测tinyint(1)列并自动将其强制转换为bool,然后执行此操作直到MySQL支持真正的布尔列吗?我知道他们正在计划,但是…请记住,默认情况下,PHP/MySQL驱动程序返回的列值只是字符串(即非类型化的字节数组)。这个简短的片段演示了这一点:
//mysqli驱动程序
$c=mysqli_connect($host、$user、$pass、$dbname);
$r=mysqli_查询($c,'SELECT*fromfoo');
$f=mysqli\u fetch\u数组($r);
foreach($f为$k=>$v){
echo“$k=>$v[”.gettype($v)。]'.PHP_EOL;
}
//PDO
$c=newPDO(“mysql:dbname=$dbname;host=$host”,$user,$pass);
$r=$c->query('SELECT*fromfoo');
$f=$r->fetch();
foreach($f为$k=>$v){
echo“$k=>$v[”.gettype($v)。]'.PHP_EOL;
}
“默认情况下”,因为可以为驱动程序提供映射,以便它可以将这些字符串转换为原生PHP类型。为此,mysqli
has,PDO
has
虽然可以从元数据,甚至从表定义中检索实际的列类型,但在典型情况下,客户机应用程序提前知道它
底线是:您确实想这样做(或做类似的事情):
。。。因为事实上你也应该这样做:
$recordSet[$i]['myIntColumn'] = (int)$recordSet[$i]['myIntColumn'];
但是PHP在类型方面非常松散,毕竟我不会太担心这一点。这是一个很好的解决方案,可以使用什么样的数据类型,但是它不能很好地解决如何从查询中高效地获得纯PHP真/假值的问题,它更概括了哪些数据类型存储值。无论我使用的是BIT还是tinyint(1),当通过
json\u encode
select运行查询结果时,返回字符串“1”或“0”仍然存在同样的问题,CASE blnColumn当“0”时返回“FALSE”,当“1”时返回“FALSE”,然后返回“TRUE”
——或者,您可以始终将myVariable转换为number客户端。类似于:{{{#if+myVariable}}.tinyint(1)应该可以很好地满足您的需要。只要在客户机上正确解码json对象,就可以使用PHP和javascript true/false语法(有关Zero和js的更多信息:)
$recordSet[$i]['myBoolColumn'] = (bool)$recordSet[$i]['myBoolColumn'];
$recordSet[$i]['myIntColumn'] = (int)$recordSet[$i]['myIntColumn'];