やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

SQLite3ドットコマンド(.binary)

 バイナリ形式のデータを出力するか否か。

成果物

.help

.binary on|off           Turn binary output on or off.  Default OFF

.binary

 デフォルトOFFとあるが、バイナリデータも出力されていなかったか?

 SQLファイル作成。

echo "create table T(C blob);
insert into T values(x'FF');
insert into T values(randomblob(16));" > create_0.sql

 バイナリデータを出力してみる。

sqlite3 :memory: \
".read create_0.sql" \
"select * from T;"
�
�7�e�6l7ϵ

 出ている。

 odコマンドで表示してみる。

sqlite3 :memory: \
".read create_0.sql" \
"select * from T;" > 0.bin
od -h 0.bin
0000000 0aff 88e6 e057 c608 0622 2e02 7ad3 99c0
0000020 2a33 000a
0000023

 やはりバイナリは出力されている。

 念の為、on, offを明示して確認。

sqlite3 :memory: \
".binary on" \
".read create_0.sql" \
"select * from T;" > 0_on.bin
od -h 0_on.bin
0000000 0aff 9555 8c25 1ee0 60af 7222 560f 2701
0000020 0f90 000a
0000023
sqlite3 :memory: \
".binary off" \
".read create_0.sql" \
"select * from T;" > 0_off.bin
od -h 0_off.bin
0000000 0aff 300f f61f 7c55 4e22 9f60 6f39 10a2
0000020 b40a 000a
0000023

 両方ともバイナリが出力されている。というか、バイナリが出力されなかったら困るので、これでいいのだが。

 なら、.binaryとかいうコマンドは何の役に立つの?

.dump

 .dumpして出力されたSQLもまた、.binaryonでもoffでも出力される。

echo "create table T(C blob);
insert into T values(x'FF');
insert into T values(randomblob(16));" > create_1.sql

 それを.binary on.dumpする。

sqlite3 :memory: \
".binary on" \
".read create_1.sql" \
".dump"
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE T(C blob);
INSERT INTO T VALUES(X'ff');
INSERT INTO T VALUES(X'8c5db73b52a76303b70aeb40a04732fb');
COMMIT;

 offでも確かめる。

sqlite3 :memory: \
".binary off" \
".read create_1.sql" \
".dump"
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE T(C blob);
INSERT INTO T VALUES(X'ff');
INSERT INTO T VALUES(X'b6aedc2b984721779d8232e4fbc290d4');
COMMIT;

 こっちでもバイナリ・リテラルで表示された。on/offの違いが何もない……。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux

前回まで