SQLiteを使ってみる!(パート2)
前回のをencode/decodeを使って書き換えてみました。
『from_toはバイト文字列をバイト文字列に変換するのでよくないです』、とのご指摘もありましたので…。
use strict; use warnings; use DBI; use Encode; use utf8; binmode STDOUT, ':encoding(shiftjis)'; # メモリ上のデータベースへ接続 my $dbh = DBI->connect("dbi:SQLite:dbname=:memory:"); # ディスク上のデータベースへ接続 #my $database = 'test.db'; #my $data_source = "dbi:SQLite:dbname=$database"; #my $dbh = DBI->connect($data_source); my $create_table = 'create table books (' . 'タイトル,' . '著者' . ');'; $dbh->do($create_table); # insert文の実行 $dbh->do(encode('UTF-8', q/insert into books (タイトル, 著者) values ('Perl', '啓仁');/)); $dbh->do(encode('UTF-8', q/insert into books (タイトル, 著者) values ('C++', '康友');/)); $dbh->do(encode('UTF-8', 'insert into books (タイトル, 著者) values (\'Python\', \'ken\');')); $dbh->do(encode('UTF-8', 'insert into books (タイトル, 著者) values (\'Java\', \'成憲\');')); # update文の実行 $dbh->do(encode('UTF-8','update books set タイトル = \'Ruby\' where 著者 = \'成憲\'')); # delete文の実行 $dbh->do(encode('UTF-8','delete from books where 著者 = \'ken\';')); # select文の実行 my $sth = $dbh->prepare("select * from books;"); $sth->execute; # 各行のフェッチ while (my @row = $sth->fetchrow_array) { # 各行を出力 print decode('UTF-8', "$row[0] : $row[1]"), "\n"; } undef $sth; # データベースの切断 $dbh->disconnect;
◆解説(kitsさん、ご指摘により加筆、いつもありがとうございます)
- ソースをUTF-8で記述して、『use utf8;』すると、Perl内部文字列(utf8フラグが付加)になる。
- DBへ書き込む直前にencodeで、Perl内部文字列をUTF-8文字列(utf8フラグを落とす)に変換する(※1)。
- DBから読み込んだ直後にdecodeで、UTF-8文字列をPerl内部文字列(utf8フラグ付ける)に変換する。
- 『binmode STDOUT, ':encoding(shiftjis)';』は、Perl内部文字列をshiftjis文字列に変換して標準出力される。
※1:実は、encodeしなくてもSQLiteで自動的に行う模様です。もちろん明示的にencodeした方がいいと思います。