我有一个包含一列bit(1)
和以下查询的表:SELECT my_bit FROM my_table
.
当我echo
在php
页面上显示结果时,该值显示为string(3)
%qu
列上的位值是 0 还是 1。这怎么可能?
以下查询解决了echoing
在网页上时的问题:SELECT CAST(my_bit AS UNSIGNED) AS my_bit FROM my_table
.
但是,上述两个查询都在命令行工具上工作。那里没有string(3)
。
选择数据时一切正常,之间没有区别
- SELECT * FROM my_table WHERE my_bit=0
- SELECT * FROM my_table WHERE my_bit=(0)
使用命令行工具或 Web 界面php
页面时。(此处建议使用后者。)Echoing
必须使用CAST
函数完成,但WHERE
不受括号影响:返回正确的行。
主要问题
- 为什么返回的
bit
类型值无论是 0 还是 1都echoed
一样?string
bit
bit(1)
使用类型列插入/选择数据时,是否有任何特殊问题需要考虑?(快速测试表明一切都按预期工作:0 插入为 0,1 插入为 1,但我可能遗漏了一些东西。)
我正在使用 MAMP 进行本地测试:PHP 5.3.2 和 MySQL 5.1.44。命令行工具指的是 Sequel Pro(不是 MAMP 的 PhpAdmin)。Php
页面utf-8
和查询使用SET NAMES 'utf8'
.
更新:代码
CREATE TABLE `my_table` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`my_bit` bit(1) NOT NULL,
PRIMARY KEY (`id`,`lto_muu`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci;
INSERT INTO `my_table` (`id`, `my_bit`) VALUES (null, 0), (null,1)
//php page
//query option 1
SELECT `id`, `my_bit` FROM `my_table`
//query option 2
SELECT `id`, CAST(`my_bit` AS UNSIGNED) AS `my_bit` FROM `my_table`
$mysqli = new mysqli("localhost", "root", "root","my_db");
$q = "SELECT `id`, `my_bit` FROM `my_table`";//returns 2 rows
$r = $mysqli->query($q);
while($row = mysqli_fetch_array($r,MYSQLI_ASSOC)){
echo 'id: ' . $row['id'] . ' - bit: ' . $row['my_bit'] . '<br />';
}
查询选项 1 打印出:
id: 1 - bit: %qu
id: 2 - bit: %qu
查询选项 2 打印出:
id: 1 - bit: 0
id: 2 - bit: 1
更新 2:Álvaro 的代码
$conn = new mysqli('localhost', 'root', 'root','test');
//$mysqli->set_charset('utf8');
$conn->query('DROP TABLE IF EXISTS bit_test');
$conn->query('CREATE TABLE bit_test (
my_bit BIT(1) NULL,
my_multiple_bit BIT(8) NULL
)');
$conn->query("INSERT INTO bit_test (my_bit, my_multiple_bit) VALUES (b'0', b'111')");
$conn->query("INSERT INTO bit_test (my_bit, my_multiple_bit) VALUES (b'1', b'10000000')");
//opt 1
$q = 'SELECT cast(my_bit as unsigned) as my_bit, my_multiple_bit FROM bit_test';
//opt2
//$q = 'SELECT my_bit, my_multiple_bit FROM bit_test';
$r = $conn->query($q);
while($row = mysqli_fetch_array($r, MYSQLI_ASSOC)){
echo bin2hex($row['my_bit']) . '<br />';
echo bin2hex($row['my_multiple_bit']) . '<br />';
var_dump($row);
echo '<br /><br />';
}
使用PHP 5.2.12 选项1 和 2 都打印:
30
07
array(2) {
["my_bit"]=>
string(1) "0"
["my_multiple_bit"]=>
string(1) ""
}
31
80
array(2) {
["my_bit"]=>
string(1) "1"
["my_multiple_bit"]=>
string(1) "�"
}
使用PHP 5.3.2 opt 1 打印:
30
257175
array(2) {
["my_bit"]=>
string(1) "0"
["my_multiple_bit"]=>
string(3) "%qu"
}
31
257175
array(2) {
["my_bit"]=>
string(1) "1"
["my_multiple_bit"]=>
string(3) "%qu"
}
并选择 2:
257175
257175
array(2) {
["my_bit"]=>
string(3) "%qu"
["my_multiple_bit"]=>
string(3) "%qu"
}
257175
257175
array(2) {
["my_bit"]=>
string(3) "%qu"
["my_multiple_bit"]=>
string(3) "%qu"
}
PHP 5.3.2 允许打印%qu
。这有道理吗?