• 締切済み

class:DBIについて

はじめまして。 perlのclass::DBIを使ってプログラムを書いています。 このclass::DBIで文字コードを指定するにはどうしたらいいのかわかりません。 (set names utf8というやつです。) わかる方教えてください。 今は次のように記述しています。 package CDBI; use strict; use base 'Class::DBI'; $Class::DBI::Weaken_Is_Available = 0; __PACKAGE__->set_db('Main', 'DBI:mysql:database', 'user', 'pass'); 1;

みんなの回答

  • vsba23895
  • ベストアンサー率58% (18/31)
回答No.1

データベースハンドルに対して do() するだけです。 use strict; use DBI; ... my $DB= DBI->connect(qq<dbi:mysql:dbname=$name;host=$host;port=$port>,$owner,$passwd); $DB->do(q(set names utf8)); # エラー処理などは全部省略。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • DBIが入っているはずですが、、、

    【 windows7 64bit + MySQL5.5 + ActivePerl 5.16.3 】 コマンドプロンプトで直接、 c:\>ppm install DBI No missing packages to install というメッセージがでます、これは「もうインストールされてるよー」という意味だと思いますが、プログラムを実行しても、 Software error: DBD::MySQL initialisation failed: Can't locate object method "driver" via package "DBD::MySQL" at C:/usr/local/lib/DBI.pm line 808. Perhaps the capitalisation of DBD 'MySQL' isn't right. at C:/Apache2.2/htdocs/00001/shinki_data_sakusei.pl line 33. というエラーがでます。 ====================================== # 初期設定部分 use strict; use warnings; # エラーをブラウザに表示 use CGI::Carp qw(fatalsToBrowser); use utf8; binmode STDIN, ':encoding(UTF-8)'; binmode STDOUT, ':encoding(UTF-8)'; binmode STDERR, ':encoding(UTF-8)'; use Encode; use DBI; # プログラム開始 # ユーザ名とパスワード my $dbname = 'login_data'; my $dbhost = 'localhost'; my $user = 'root'; my $pass = 'root'; #データベースへ接続 my $db = DBI->connect( "DBI:MySQL:dbname = $dbname;host = $dbhost", $user, $pass ); if ( ! $db ){ print "エラー: $db->err $db->errstr\n"; } # 命令 my $sth = $db->prepare( "SELECT * FROM login" ); # 実行 $sth->execute; # 出力 while( my @row = $sth->fetchrow_array ){ print "@row\n"; } #データベースから切断 $db->disconnect; __END__

    • ベストアンサー
    • Perl
  • perlのDBIよりMysqlにアクセスすると

    perlのDBIよりMysqlにアクセスすると DBD::mysql::db do failed: Data too long for column...のエラーが発生します。 つまり長すぎるデータを格納しようとしてエラーが出ているようです。 格納するデータの文字コードはutf-8です。 カラムは試しにvarchar(255)にしていますので、おそらく文字コードが原因ではないかと推測しています。 phpMyAdminから SHOW VARIABLES;コマンドを実行したところ 文字コード関係は以下の設定です。 character_set_client utf8 character_set_connection utf8 character_set_database utf8 character_set_filesystem binary character_set_results utf8 character_set_server sjis character_set_system utf8 character_sets_dir C:\Program Files\MySQL\MySQL Server 5.0\share\char... collation_connection utf8_general_ci collation_database utf8_general_ci collation_server sjis_japanese_ci 開発環境は MySQL - 5.0.24-community-nt phpMyAdmin - 2.8.2.2 MySQL クライアントバージョン: 4.1.7 OS;WIN_XP Active Perl 5.8.8 です。 お気付きの点がございましたらご指摘宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • MYSQL 4.1 の余計なエスケープ処理

    おはようございます。PERL 5.8.5 からMYSQL4.1 サーバーへのデータINSERT 時の文字変換処理について教えてください。 MYSQL 4.1 の文字コードは次の通りです。 SHOW VARIABLES LIKE 'character?_set?_%'; の結果 character_set_client :binary character_set_connection:binary character_set_database:utf8 character_set_results:binary character_set_server:utf8 character_set_system:utf8 MYSQL 4.1 サーバーが上記のような状態で、PERL で次の処理をします。なお、PERL ソース自体はEUC で書かれています。 #!/usr/bin/perl use Jcode; use DBI; $string = "あああ"; Jcode::convert( ?$string, 'utf8', 'euc' ); $dbh = DBI->connect( 'DBI:mysql:DB名:ホスト名:3306', 'ユーザー名', 'パスワード' ,{AutoCommit => 0} ); $sth = $dbh->prepare( "set names utf8" ); $sth->execute; $sth->finish; $sth = $dbh->prepare( "insert into test values( ? )" ); $sth->bind_param( 1, $string ); $sth->execute; $sth->finish; $dbh->commit; $dbh->disconnect; 上記のソースを実行すると、MYSQL 4.1 サーバーには [あ?あ?あ] のような、余計なエスケープが掛かった状態で文字がINSERT されているのです。 私としては、set names utf8 で、MYSQL 4.1 サーバーとクライアントで同様の文字コードを使うようにしているので、MYSQL 4.1 における余計な文字コード変換はないものと思っています。余計な文字コード変換がないにもかかわらずエスケープ文字が入る理由が分かりません。 この現象についてお分かりの方がいらっしゃいましたら教えて頂きたく思います。なお、ネットでも調べたのですが、どの方も未解決でしたので質問さえて頂きました。 お願いします。

  • classについて

    $server = "localhost"; $database = "hoge"; $user = "user"; $pass = "pass"; $con = mysql_connect ($server, $user, $pass); mysql_select_db ($database, $con); $sql = "SELECT * "; $sql.= "FROM `table` "; while ($result = mysql_fetch_array ($rs, MYSQL_ASSOC)) { echo $result[hoge]; } 上記と同じことを下記のようなクラスにして db.php class db { $server = "localhost"; $database = "hoge"; $user = "user"; $pass = "pass"; function __construct() { $this->con = mysql_connect ($this->server, $this->user, $this->pass); mysql_select_db ($this->db, $this->con); } function query($sql){ $rs = mysql_query ($sql); return mysql_fetch_array ($rs, MYSQL_ASSOC); } hoge.php $db = new db(); $sql = "SELECT * "; $sql.= "FROM `table` "; while ($db->query($sql)) { echo $result[hoge]; } のようにしたのですが、うまくいきません。 function query($sql){ $rs = mysql_query ($sql); $result = mysql_fetch_array ($rs, MYSQL_ASSOC); } とすると一行はとれるのですが、複数行とるにはどうしたらいいのでしょうか・・・ どうかよろしくお願いします。

    • 締切済み
    • PHP
  • perlでのDBI接続

    こんにちは。 DBI自体良く分かっていないのですが下記はperlでDBIにアクセスするようなのですがどのようなことを定義しているのでしょうか? $Config{DB_DSN} = 'DBI:mysql:palnet;hostname=**.**.*.*'; $Config{DB_AAA} = 'aaa'; $Config{DB_BBB} = 'bbb'; $Config{DB_AAA} は『aaaですよ』ってことですか? だとしたら『DBI:mysql:palnet』の意味がわかりません。 サイトとか検索して調べてみたのですがいまいちわかりませんでした。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • DBIモジュールと Perl5.8

    Perl5.8のエンコードが理解できずに困っております。 MySQLでは、utf8の文字コードのデータがあります。 以下のスクリプトを実行させると、 Wide character in print at C:/usr/local/site/lib/DBI.pm line 1008. となります。 対処方法はあるのでしょうか? use utf8; use strict; use DBI; my $dbh = DBI->connect("dbi:mysql:dbname=test", "root", "", { AutoCommit=>1, PrintError=>1, RaiseError=>1} ); my $fname = "test.txt"; my $sth = $dbh->prepare("select id, namae from test order by id asc;"); $sth->execute(); # 出力ファイルを開く。 open FILE, ">" , $fname or die "Can't open $fname: $!"; # 整形された結果をファイルにダンプする。 my $rows = $sth->dump_results(80, "\n", ",", \*FILE); # 出力ファイルを閉じる。 close FILE or die "Error closing result file: $!\n"; $dbh->disconnect();

    • ベストアンサー
    • Perl
  • ActivePerl を使用して MySQL に

    すいません、初心者です。 ActivePerl を使用して MySQL にアクセスしたいです。 windows7 64bit にActivePerlとMySQLを入れ込みました。 MySQLにアクセスするためのユーザー名やパスワードは root です。 login_data というテーブルを適当作成しました。 実際にアクセスしてみるには、どのようなコードを書けばいいでしょうか? =========================================== use strict; use warnings; # エラーをブラウザに表示 use CGI::Carp qw(fatalsToBrowser); use utf8; binmode STDIN, ':encoding(UTF-8)'; binmode STDOUT, ':encoding(UTF-8)'; binmode STDERR, ':encoding(UTF-8)'; use Encode; use DBI; # プログラム開始 # ユーザ名とパスワード my $user = 'root'; my $pass = 'root'; #データベースへ接続 my $db = DBI->connect('DBI:MySQL:localhost:login_data', $user, $pass,); if ( ! $db ){ print "エラー: $db->err $db->errstr\n"; } # 命令 my $sth = $db->prepare( "select * from test" ); # 実行 $sth->execute; # 出力 while( my @row = $sth->fetchrow_array ){ print "@row\n"; } #データベースから切断 $db->disconnect; __END__

    • ベストアンサー
    • Perl
  • DBIがうんともすんとも言いません だれか助けてください

    症状: perlのプログラム内でDBIを使うと、その後の行がすべてスキップされてしまいます。エラーをだしてくれることもなく、何が原因なのかさっぱりわかりません。 「 #!/usr/bin/perl use DBI; print "Content-type: text/html", "\n\n"; print "this is test"; $d = 'DBI:mysql:test:Localhost';# データソース $u = 'root';# ユーザ名 $p = 'mypass';# パスワード # データベースへ接続 $dbh = DBI->connect($d, $u, $p) or print "Can't connect to MySQL"; print "<br />success!"; 」 「this is test」は表示されるのですが、「success!」が表示されないのです。もちろん「Can't connect to MySQL」も、その他のエラー表示も表示されません。 「 $dbh = DBI->connect($d, $u, $p) or print "Can't connect to MySQL"; 」 の行を消すと、「success!」も表示されます。 DBIを再インストールしたほうがよいのでしょうか? もともと、DBIをインストールするとき、いろいろてこずっていて、その時に何かおかしなことになってしまったのかもしれません。 それとも別の場所に問題があるのでしょうか。 ________________________________ 環境: Ubuntu8 Xampp ちなみにcpanで i DBIとやると、 「 CPAN: Storable loaded ok (v2.18) Going to read /root/.cpan/Metadata Database was generated on Fri, 20 Jun 2008 07:02:51 GMT Strange distribution name [DBI] Bundle Bundle::DBI (TIMB/DBI-1.605.tar.gz) Module = DBI (TIMB/DBI-1.605.tar.gz) 2 items found 」 とでます。 この問題のおかげでもう2日間作業がすすまないでいます。どなたか力をかしてください。おねがいします。

    • ベストアンサー
    • Perl
  • aaacafe(AAA!CAFE)でDBIがつかえない

    aaacafe(AAA!CAFE)でperlでmysqlを使いたいのですが、「内部サーバエラー」がでて、使えません。 いろいろ設定してみたところ、 use DBI を宣言した時点でだめみたいです。 そこで質問ですが、perlからmySQLを使うにはどうすればいいのでしょうか? できればDBI経由で設定したいです。実際に使えている方がいましたらお教え願います。phpならサンプルがあるのですが。

  • DBIを使用して物理的に分かれているPostgresに接続するには

    こんにちは。 WebサーバーとDBサーバー(postgres)があって、 WebのPerlプログラムからDBIを使用してのDB接続方法がわからなくて困ってます。 Webサーバーと同じPCにpostgreも入っている環境で動作してましたが、 DBサーバーを独立させることになったのですが connectの記述方法がわからないのです。 $dbh = DBI->connect("dbi:Pg:dbname=test", $user_name, $pass); 今まではこのような記述でOKでした。 しかし、今度は物理的に別れているので、 DBサーバーを指定するIPアドレスを記述する必要があるのかな、と思い (WebとDBサーバーはLANで直につながっています) $dbh = DBI->connect("dbi:Pg:dbname=test:host=XXX.XXX.XXX.XXX", $user_name, $pass); 等を試してみたのですがダメでした。 Webサーバー側のDBI・ドライバ設定は正しく動作しています。 (DBI->available_drivers;でドライバの列挙は正しく取得できているので) もちろんDBは正しく作成されています。 (DBサーバーで作ったユーザーは、DBログイン時にPassがいらない設定になってますが) 色々調べてみたのですが、IPアドレスを指定してのDB接続等の情報が どうしてもみつかりませんでした。 どなたかご存知の方、ぜひともご教授ください。