sqlite3 で日本語を使う

sqlite3 で日本語のデータが扱えるのだろうか。

Mac のターミナルを起動して LANG の値を出力したらつぎのようになった。

Tomokiyo-no-MacBook-Pro:~ tomokiyo$ echo $LANG
ja_JP.UTF-8

そこで、試しにデータベースを作って日本語のデータを入力してみた。

$ sqlite3 names.db "create table members (mkey integer primary key, name text, age integer);"
$ sqlite3 names.db "insert into members (name, age) values ('桃太郎',18);
$ sqlite3 names.db "insert into members (name, age) values ('かぐや',16);
$ sqlite3 names.db "insert into members (name, age) values ('金太郎',12);

$ sqlite3 names.db "select * from members where name='かぐや'"
2|かぐや|16

無事、日本語での検索ができた。

そこで欲を出して郵便番号のデータベースを作ってみることにした。郵便局のホームページから郵便番号の CSV ファイルをダウンロードした。

ダウンロードした KEN_ALL.CSV は CR-LF 改行の S-JIS ファイルなので nkf を使って次のように LF 改行の UTF-8 ファイルにした。

$ nkf -w -Lu KEN_ALL.CSV > yubin.csv

nkf が Mac に入っていないときは MacPorts がインストールされていれば、

$ port install nkf

でインストールできる。

そこで郵便番号のデータベース yubin.db を次のようにして作った。

$ sqlite3 yubin.db "create table master (dantai text, zip_old text, zip text, ken text, si text, cho text, kenmei text, simei text, chomei text, op1 integer, op2 integer, op3 integer, op4 integer, op5 integer, op6 integer);"

CSV ファイルからのデータのインポートは次のようにした。

$ sqlite3 -separator , yubin.db ".import yubin.csv master"

日本語で検索すると実行できた。

$ sqlite3 yubin.db "select * from master where cho='ヤマカワマチ'"
40203|839 |8390817|フクオカケン|クルメシ|ヤマカワマチ|福岡県|久留米市|山川町|0|0|0|0|0|0
42204|854 |8540074|ナガサキケン|イサハヤシ|ヤマカワマチ|長崎県|諫早市|山川町|0|0|0|0|0|0

これで、sqlite3 で日本語が使えることがわかった。

ところが落とし穴があった。次のように sqlite3 のインタラクティブモードに入ると、日本語の入力ができないことがわかった。sqlite3 のコマンドラインが日本語入力に対応してないためだ。

$ sqlite3 yubin.db

前途多難だ。心配になったので、Haskell の getLine が日本語を受け付けるかどうか試してみた。

Prelude> getLine >>= putStrLn
おはよう
おはよう

こちらのほうは、大丈夫なようだ。

Mac でうまくいったので Ubuntu でもやってみた。yubin.db を作るところまではうまくいったのだが、

$ sqlite3 yubin.db "select * from master where cho='ヤマカワマチ'"

とやっても、レコードが検索できない。かくとうしているうちにフィールドのデータが ヤマカワマチ ではなく、 "ヤマカワマチ" のように引用符つきで表示されているのに気づいた。そこで、csv ファイルを次のように加工して yubin2.csv をつくりインポートしたらうまくいった。

$ sed s/\"//g yubin.csv > yubin2.csv
$ sqlite3 -separator , yubin.db ".import yubin2.csv master"

ところが、Ubuntu の sqlite3 ではインタラクティブモードでも日本語が入力できた。機種によって反応が違うので注意しなければならない。
[PR]
by tnomura9 | 2012-12-29 22:14 | Haskell | Comments(0)
<< sqlite3 によるアミノ酸... HDBC >>