end0tknr's kipple - web写経開発

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

DBD::mysqlでperlからmysqlに接続(機種依存文字や0x5Cも問題なし)

mysqlのinstallが完了したので、今回はDBD::mysqlperlからmysqlへの接続方法を紹介します。

DBD::mysqlのinstall

$ /usr/local/bin/perl Makefile.PL \
    --mysql_config=/usr/local/mysql/bin/mysql_config \
    --testdb=endo_test \
    --testuser=endo \
    --testpassword=ないしょ
$ make
$ make test
# make install

私の場合、mysqlを/usr/local/mysql へinstallした為、「perl Makefile.PL」でいくつかのoptionを指定する必要があります。

--mysql_config

mysql_configの場所を指定しています。

--testdb --testuser --testpassword

「make test」では、テスト用のdatabaseを使用しますが、そのdb名や接続ユーザを指定しています。

DBD::mysqlの接続テスト(機種依存文字や0x5Cも問題なさそう)

以下では、DBD::mysqlでの接続テストを行うscriptを記載しておきます。
今回行った範囲では、機種依存文字(㈱,①)や0x5C(ソ)も問題なさそうです。

#!/usr/local/bin/perl

use strict;
use warnings;
use encoding "cp932"; #DBのサーバ側のencodingはutf8
use Encode;
use DBI;
use Data::Dumper;

my $DB = "DBI:mysql:dbname=endo_test;host=localhost;";
my $DB_USER = "endo";
my $DB_PASS = "ないしょ";
my $DBI_OPT = { AutoCommit => 0 };

sub main {

    my $dbh = connect_db();

    test_insert($dbh);
    test_select($dbh);

#    $dbh->commit();
    $dbh->disconnect();
}

sub test_insert {
    my ($dbh) = @_;
    my $sql =<<EOF;
insert into test values (?);
EOF
    my $sth = $dbh->prepare($sql);
    #機種依存文字と0x5C問題を確認します。
    $sth->execute( encode("utf8","遠藤㈱エンドウソ①" ) );

}

sub test_select {
    my ($dbh) = @_;

    my $sql =<<EOF;
select * from test
EOF
    my $sth = $dbh->prepare($sql);
    $sth->execute();
    while (my $row = $sth->fetchrow_hashref() ) {
	#server側のencodeはutf8なので、一旦decodeし、cp932にencodeしてます
        print STDERR encode("cp932", decode("utf8","$row->{col1}")."\n" );
    }
}

sub connect_db {
    my $dbh = DBI->connect($DB,$DB_USER,$DB_PASS,$DBI_OPT);
#    $dbh->do("SET NAMES $CLIENTENCODING") or die "cannot set encoding";
    return $dbh;
}

main();
[endo@colinux tmp]$ ./mysql_test.pl 
遠藤㈱エンドウソ①
[endo@colinux tmp]$