系统:Debian Jessie(在cubietruck,armv7上)
PHP和MySQL已经从最新的源代码编译(PHP 7.1.9,MySQL 5.7.19)。 PHP信息:https://ibb.co/ggbsZQ
当我尝试使用mysqli或pdo检索bit(1)列值时,它返回字符串(20),基本上它是一个巨大的数字而不是一位。
表格结构和数据:
create table TestValue (
Id int not null auto_increment
,StringValue nvarchar(32)
,BitValue bit(1)
,TinyintValue tinyint(1)
,IntValue int
,DoubleValue double
,DateTimeValue datetime
,primary key (Id)
) engine=InnoDB default charset=utf8 collate=utf8_general_ci;
insert into TestValue (StringValue, BitValue, TinyintValue, IntValue, DoubleValue, DateTimeValue)
values (N'Test string 2', 1, 1, 42, 3.141517, '2017-09-01 12:45:11')
,(N'String 2', 0, 0, 128, 4.5, '2017-09-01')
,(null, null, null, null, null, null);
测试代码:
echo "pdo:\n";
$pdo = new PDO("mysql:host=localhost;dbname=$db", $user, $password);
$stmt = $pdo->prepare('select BitValue, TinyintValue from TestValue');
$stmt->execute();
$rowset = $stmt->fetchAll(PDO::FETCH_OBJ);
var_dump($rowset);
echo "\nmysqli:\n";
$mysqli = new mysqli('localhost', $user, $password, $db);
$result = $mysqli->query('select BitValue, TinyintValue from TestValue');
while ($row = $result->fetch_assoc())
{
var_dump($row);
}
结果:
pdo:
array(3) {
[0]=>
object(stdClass)#4 (2) {
["BitValue"]=>
string(20) "12999622736513859585"
["TinyintValue"]=>
string(1) "1"
}
[1]=>
object(stdClass)#5 (2) {
["BitValue"]=>
string(20) "12999622757988696064"
["TinyintValue"]=>
string(1) "0"
}
[2]=>
object(stdClass)#6 (2) {
["BitValue"]=>
NULL
["TinyintValue"]=>
NULL
}
}
mysqli:
array(2) {
["BitValue"]=>
string(20) "12999763474002214913"
["TinyintValue"]=>
string(1) "1"
}
array(2) {
["BitValue"]=>
string(20) "12999763495477051392"
["TinyintValue"]=>
string(1) "0"
}
array(2) {
["BitValue"]=>
NULL
["TinyintValue"]=>
NULL
}
我可以使用tinyint(1)而不是bit(1)但是很多项目使用bit来存储bool值,可能这些项目在我的环境中无法正常工作。
主要问题是如何正确检索位值?