end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

mysql_enable_utf8でperl-mysql間の文字列をflaged utf8に統一

以前のencodingは sjis(cp932)やらeuc-jp等、作るものによってバラバラでしたが、utf8に統一されるようになってきたので、備忘として書いておきます。

http://search.cpan.org/perldoc?DBD::mysql

以下のようにdb接続時に mysql_enable_utf8 を指定すれば、perl-mysql間の文字列をフラグ付utf8に統一できます。

#!/usr/local/bin/perl
use strict;
use warnings;
use utf8;
use DBI;
use Encode;
use Data::Dumper;

my $CONF_DB =
    {host =>    "localhost",
     port=>     "3307",
     db_name=>  "test_db",
     db_user=>  "test_user",
     db_pass=>  "ナイショ",
     db_opt=>{
              AutoCommit=>0,
              RaiseError=>1,
              ShowErrorStatement=>1,  #エラー時にSQLの中身も出力
              mysql_enable_utf8=>1,
              on_connect_do => [
                                "SET NAMES 'utf8'",
                                "SET CHARACTER SET 'utf8'"
                               ],
             }
    };

main();

sub main {
    my $dbh = connect_db();     #DB接続

    my $sql =<<EOF;             #test sql
select name from anken;
EOF
    my $hash_ref = $dbh->selectrow_hashref($sql);       #sql発行

    my $is_flaged_utf8 =        #utf8のフラグ有無確認
        Encode::is_utf8($hash_ref->{name}) ? "utf8 flaged":"no utf8 flaged";
    print encode('utf8',$hash_ref->{name}) , " : $is_flaged_utf8\n";

#    $dbh->commit();
    $dbh->disconnect();         #DB切断
}

sub connect_db {
    my $db =
        "DBI:mysql:database=$CONF_DB->{db_name};host=$CONF_DB->{host}";
    my $dbh = DBI->connect($db,
                           $CONF_DB->{db_user},
                           $CONF_DB->{db_pass},
                           $CONF_DB->{db_opt}); #DB option設定
    return $dbh;
}

http://search.cpan.org/perldoc?DBD::Pg
postgres(DBD::Pg)では、pg_enable_utf8 のようですね。

#!/usr/local/bin/perl
use strict;
use DBI;
use Data::Dumper;

my $DB_CONF =
    {db_name => 'dbi:Pg:dbname=kaigan;host=localhost;port=5432;',
     user => 'postgres',
     passwd => '',
     option => {AutoCommit => 0,
	       pg_enable_utf8 => 1}};

main(@ARGV);

sub main {
    my ($lon_lat_file) = @_;

    my $dbh = connect_db();
    #do something
    $dbh->disconnect();
}

sub connect_db {
    return DBI->connect($DB_CONF->{db_name},
			$DB_CONF->{user},
			$DB_CONF->{passwd},
			$DB_CONF->{option});
}