列bit(1)
と次のクエリを含むテーブルがありますSELECT my_bit FROM my_table
。
ページecho
の結果を見ると、値は列のビット値が0か1かとして表示されます。これはどのように可能ですか?php
string(3)
%qu
次のクエリechoing
は、Webページでの問題を解決しました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
主な質問
- 値が0であろうと1であろうと、返される
bit
型の値がechoed
同じになるのはなぜですか?string
bit
bit(1)
タイプ列を使用してデータを挿入/選択するときに考慮すべき特別な問題はありますか?(クイックテストでは、すべてが意図したとおりに機能することが示されています。0は0として挿入され、1は1として挿入されますが、何かが欠落している可能性があります。)
私はこれをMAMPでローカルにテストしています:PHP5.3.2とMySQL5.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:アルバロのコード
$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 opt 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"
}
PHP5.3.2alvaysは印刷し%qu
ます。これは意味がありますか?