perlでmysqlのデータを読み込む際に表示される「?????」の対処方法

このQ&Aのポイント
  • perlからmysqlにアクセスしてデータを読み込むと日本語が「??????」と表示されます。mysqlの文字コードやperlの設定を確認し、適切な変換処理を行うことで文字化けを解消することができます。
  • mysqlのテーブルから取り出した値をjcode.plで変換しても変わらないようです。設定の足りない箇所があるかもしれませんので、再度設定を確認してください。
  • ブラウザで文字の種類を変えても「?????」のままです。文字化けの原因はmysqlやperlの設定にあるかもしれませんので、正しい文字コードを指定してください。
回答を見る
  • ベストアンサー

mysqlのデータをperlで読み込んで????を表示される

過去にもあった質問なのですが、アドバイスお願いします。 perlからmysqlにアクセスしてデータを読み込むと日本語が「??????」と表示されます。 バージョンは下の通りです。 perl:ActivePerl-5.8.8.820-MSWin32-x86-274739 mysql:5.0 OS:windowsXP mysqlの文字コードはstatusで確かめました。 mysql> status; -------------- mysql Ver 14.12 Distrib 5.0.27, for Win32 (ia32) Connection id: 74 Current database: Current user: ******@localhost SSL: Not in use Using delimiter: ; Server version: 5.0.27-community-nt Protocol version: 10 Connection: localhost via TCP/IP Server characterset: sjis Db characterset: sjis Client characterset: sjis Conn. characterset: sjis TCP port: 3306 Uptime: 3 hours 39 min 2 sec Threads: 1 Questions: 232 Slow queries: 0 Opens: 26 Flush tables: 1 Open ta bles: 0 Queries per second avg: 0.018 -------------- mysql> SELECT * FROM table1 と打てば、日本語は表示されます。 perlのコードのコードを書きます。 #!C:/usr/local/Perl/bin/perl print "Content-type: text/html;charset=Shift_JIS\n\n"; use DBI; $user = '***'; $passwd = '***'; $sql="SELECT * FROM categ"; ----略(HTMLタグ)------ $db = DBI->connect('DBI:mysql:board:localhost', $user, $passwd); $sth = $db->prepare($sql); $sth->execute; $num_rows = $sth->rows; $categ_num=$num_rows; for ($i=0; $i<$num_rows; $i++) { @a = $sth->fetchrow_array; print"$a[0] $a[1]<br>"; } $sth->finish; $db->disconnect; ----略(HTMLタグ)------ 結果 0 ????? 1 ????? ブラウザで文字の種類を変えても「?????」のままです。 mysqlのテーブルから取り出した値をjcode.plで変換しても変わらないようです。 &jcode::convert(\$categ[$i], "sjis"); print"<tr><td>no:$i $categ[$i] </td></tr>"; まだ、設定の足りないところがあるのでしょうか。 アドバイスお願いします。

noname#213520
noname#213520
  • MySQL
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

MySQLの4.1.15以降、5.0.13以降なら my,ini またはmy.cnf のmysqld セクションに下記を追加 skip-character-set-client-handshake mySQLは再起動。 perlで同じ経験をしました。

noname#213520
質問者

お礼

アドバイスありがとうございました! 日本語が表示されました! アドバイス通りに skip-character-set-client-handshake を書き込んで再起動で解決できました。 ほんとに助かりました。ありとうございます。

関連するQ&A

  • perlでmysqlに接続

    初歩的な質問で申し訳ありません。 perlでmysqlに接続できず困っています(OSはWindowsXPです)。 バージョンは下の通りです。 perl : ActivePerl-5.8.8.820-MSWin32-x86-274739 mysql : MySQL Server 5.0 DOSでppmを入力すると「perl package manager」というウィンドウが立ち上がり、「DBD-SQLite」と「DBI」をインストールすることができました。 サンプルコードは下の通りです。 #!C:/usr/local/Perl/bin/perl use DBI; $user = '*****'; $passwd = '*****'; $db = DBI->connect('DBI:mysql:bulletin_board:localhost', $user, $passwd); $sth = $db->prepare("SELECT * FROM data"); $sth->execute; $num_rows = $sth->rows; print "該当 $num_rows 件\n"; for ($i=0; $i<$num_rows; $i++) { @a = $sth->fetchrow_array; print "no=$a[0], title=$a[1] name=$a[2] \n"; } $sth->finish; $db->disconnect; DOSで実行すると C:\Program Files\War-ftpd\FTPRoot\usr\f-taka\cgi-bin>perl sqlTest.cgi install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC (@INC contains: C:/usr/local/Perl/site/lib C:/usr/local/Perl/lib .) at (eval 4) line 3. Perhaps the DBD::mysql perl module hasn't been fully installed, or perhaps the capitalisation of 'mysql' isn't right. Available drivers: DBM, ExampleP, File, Gofer, Proxy, SQLite, Sponge. at sqlTest.cgi line 8 というエラーが出ました。原因は何なのでしょうか。 MySQL側で設定することはあるのでしょうか。 アドバイスお願いします。

    • ベストアンサー
    • Perl
  • perlからmysqlに接続できない

    #! c:/perl/bin/perl  use DBI; $user = 'root'; $passwd = 'パスワード'; $db = DBI->connect('DBI:mysql:db1:localhost', $user, $passwd); $sth = $db->prepare("INSERT INTO bunrui VALUES (1,'1st','memo')"); $sth->execute; $sth->finish; $db->disconnect; perlからmysql二接続するためDBIをインストールして、上のようなサンプルコードを実行してみたのですが Internal Server Error になってしまいます。どこかコードが違っているのでしょうか?

    • ベストアンサー
    • Perl
  • Perl初心者です。MySQLから取得したデータをXMLで出力させたいです。

    以下のようにしましたがXMLのエンコードを euc-jp にするときちんと表示されますが、utf-8 にするとダメです。 助言をお願いします。cgiファイルとDB(MySQL)の文字コードはEUC-JP、Perlのバージョンは5.6です。 #!/usr/local/bin/perl use DBI; use Jcode; $sqlStr = "SELECT * FROM Test"; $x = "Content-type: text/xml; charset =utf-8\n\n"; # utf-8 $x .= "<\?xml version=\"1.0\" encoding=\"utf-8\"\?>\n\n"; # utf-8 $x .= "<ROOT>"; $dbh = DBI->connect ("DBI:mysql: AAA: localhost","BBB","CCC "); $sth = $dbh->prepare("$sqlStr"); $sth->execute; $num_rows = $sth->rows; $num_fields = $sth->{NUM_OF_FIELDS}; for ($i=0; $i<$num_rows; $i++) { $x .= "<ROW>"; @a = $sth->fetchrow_array; for ($n=0; $n<$num_fields; $n++) { $a[$n] =~ s/&/&amp;/g; $a[$n] =~ s/</&lt;/g; $a[$n] =~ s/>/&gt;/g; $col = $sth->{NAME}->[$n]; $x .= "<$col>$a[$n]</$col>"; } $x .= "</ROW>"; } $sth->finish; $dbh->disconnect; $x .= "</ROOT>"; Jcode::convert(\$x,'euc','utf8'); # utf-8 print $x; exit;

    • ベストアンサー
    • Perl
  • perlからMySQL5に接続できません

    WindowsでperlからMySQLに接続できません。 perlは以下のようなものです。 結果は「1」と表示されるので、MySQLへの接続ができていないのだと思います。 考えられる原因がわかる方、アドバイスをお願いします。 #!/Perl/bin/perl use DBI; print "Content-type: text/html\; charset=shift_jis\n\n"; print "1"; my($dbh, $sth); $dbh = DBI->connect("DBI:mysql:database=データベース名;host=127.0.0.1", "root", "rootのパスワード",{ RaiseError => 1, AutoCommit => 0 }); print "2"; $sth = $dbh->prepare("select * from テーブル名;"); 以下略 WindowsXP SP2 Apache2.2.4 ActivePerl5.8.8 MySQL5.0

    • ベストアンサー
    • MySQL
  • MySQL5のデータを、SQL文を使いcsv形式でダウンロードさせると文字化けします

    環境:Apache2&PHP5&MySQL5 MySQL5のデータを、SQL文を使いcsv形式でダウンロードさせると文字化けします。 -- <?php header("Content-Type: application/octet-stream"); ?> <?php header("Content-Disposition: attachment; filename=output.csv"); ?> <?php $srv = "localhost"; // サーバー名 $id = "root"; // ユーザーID $passwd = "******"; // パスワード $dbn = "sample"; // データベース名 $sql = "SELECT * FROM result"; // SQL文 $db=mysql_connect($srv,$id,$passwd); mysql_select_db($dbn,$db); $rs=mysql_query($sql,$db); for($i=0; $i<mysql_num_fields($rs); $i++){ print(mb_convert_encoding(mysql_field_name($rs,$i),"SJIS","EUC-JP").","); } print("\n"); for($j=0 ;$j<mysql_num_rows($rs); $j++) { for($k=0; $k<mysql_num_fields($rs); $k++) { $str=mysql_result($rs,$j,$k); print(mb_convert_encoding($str,"SJIS","EUC-JP").","); } print("\n"); } mysql_close($db); ---ダウンロードしたCSVは半角英数文字はそのまま出ますが、 日本語(全角)が、?に化けます。(下記の参照してください) 24 2 1 444 4444 2008/7/3 15 ? 1E+18 ??? ????? ?????? 25 2 1 444 kojiide 2008/7/3 30 ? 1E+18 ??? ????? ?????? 26 2 1 444 kojiide 2008/7/3 30 ? 1E+18 ??? ????? ?????? --- print(mb_convert_encoding($str,"SJIS","EUC-JP").","); でSJISになっていると思うのですが、どなたかアドバイスいただけると幸いです。

    • ベストアンサー
    • PHP
  • perlでdb(mysql)に接続

    perlでdb(mysql)に接続し、取得したデータを 表示させるというようなことをしたいのですが、うまく いきません。 ファイル名test.cgi mysqlのバージョンは 5.0.45で 記述は以下です。 #!/usr/bin/perl use DBI; my $dbh = DBI->connect("DBI:mysql:database, "userid", "password"); my $sth = $dbh->prepare('SELECT * FROM tablename'); $sth->execute; print "Content-Type: text/plain\n\n"; print "\n"; while(my @row = $sth->fetchrow_array) { print "$row[0]:$row[1]\n"; } $sth->finish(); $dbh->disconnect(); exit; ブラウザで確認すると何も表示されず、ログとして 以下のエラーが確認できます。 DBD::mysql::st execute failed: Table 'database.tablename' doesn't exist at test.cgi line 8. DBD::mysql::st fetchrow_array failed: fetch() without execute() at test.cgi line 11. my $sth = $dbh->prepare('SELECT * FROM tablename'); で指定したテーブルは存在しておりますし、SQL文の記述も 問題ないと思われます。 また、ファイルのパーミッションは705(755でも同様の結果)です。 perl初心者のため、どこが問題なのか検討がつきません。 ご助言いただきたく存じます。 よろしくお願いいたします!

    • ベストアンサー
    • Perl
  • perl+mysqlで変数が使えなくて困ってます。

    use DBI; $id=1; $nm="gootarou"; $mm="friend"; $user = '***'; $passwd = '***'; $db = 'DBI:mysql:***'; $dbh = DBI->connect($db, $user, $passwd); $sth = $dbh->prepare("INSERT INTO list (id,name,memo) VALUES ($id,$nm,$mm)"); $sth -> execute; $sth -> finish; $dbh -> disconnect; exit; mysqlの勉強を始めたところでいきなり壁にぶちあたってしまいました^^; googleその他で検索かけてみましたが解決に至りませんでしたので 質問させてください。 >$sth = $dbh->prepare("INSERT INTO list (id,name,memo) VALUES ($id,$nm,$mm)"); ↑ここの部分を >$sth = $dbh->prepare("INSERT INTO list (id,name,memo) VALUES ('1','gootarou','friend')"); と直接入力してやれば問題なく登録されるのですが、変数を使うと正常に処理がされません。 数字を変数に代入したものは大丈夫なのですが 英字や二バイト文字を変数に代入したものが問題あるようです。 それぞれのフォームの型はvarchar(100)で設定しています。 ループで一括処理したいのですが変数が使えないことには・・と困ってます。 よろしくお願いします。

  • mysqlからmysqliへの変更点

    お世話になります。 PHPでmysqlのデータをhtmlで表示するソースを組んでいます。 初心者なもので、サンプルを見ながら組んでいるのですが、 そのサンプルがmysql_queryなどを使っていました。 しかし、今は推奨されず、mysqli_queryなどを使うとか。 そこで、単純にiを付け加えただけなのですが、そう簡単に 行きませんでした。 どの部分をどのように修正すればよいのかを教えてください。 ------------------------------------------------- <?php header("Content-Type:text/html;charset=SHIFT_JIS"); ?> <HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY> <?php $srv = "localhost"; // サーバー名 $id = "xxxxx"; // ユーザーID $passwd = "xxxxx"; // パスワード $dbn = "sample"; // データベース名 $sql = "SELECT * FROM sample1"; // SQL文 // データベースに接続する $db = mysql_connect($srv,$id,$passwd); mysql_select_db($dbn,$db); $rs = mysql_query($sql,$db); $num = mysql_num_fields($rs); //--- テーブルのレイアウト --- 開始 -----------------------> print("<TABLE border='1'><TR>"); for($i=0; $i<$num; $i++) { print("<TH>".mb_convert_encoding(mysql_field_name($rs,$i),"SJIS","EUC-JP")."</TH>"); } print("</TR>"); while($row = mysql_fetch_array($rs)) { print("<TR>"); for($j=0; $j<$num; $j++) { print("<TD>".mb_convert_encoding($row[$j],"SJIS","EUC-JP")."</TD>"); } print("</TR>"); } print("</TABLE>"); mysql_free_result($rs); mysql_close($db); //--- 終了 ---> ?> </BODY> </HTML> ---------------------------------------------- 他サイト様からの引用ですが、何卒よろしくお願いいたします。

    • 締切済み
    • PHP
  • DBD::Mysql が使用する標準のsocketはどこから得ているか?

    以下のようなスクリプトで、以下のようなエラーになっています。 port(socket)を指定しているにもかかわらず使用されない理由も分からないのですが、エラーメッセージのsocketはどこで設定されているのでしょうか? /etc/my.cnf で /tmp/mysql.sock を指定し、サーバーとクライアントは問題なく通信できています。 よろしくお願いします。 ■perlスクリプト ---------------------------------------- #!/usr/local/bin/perl use DBI; $user = 'usr'; $passwd = 'password'; $ds = 'DBI:mysql:db_name;host=localhost;port=/tmp/mysql.sock'; $db = DBI->connect($ds, $user, $passwd); (以下略) ■perlスクリプトのエラー ---------------------------------------- $ ./script_name.pl DBI connect('db_name;host=localhost;port=/tmp/mysql.sock','root',...) failed: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) at ./script_name.pl line 9 ■環境 ---------------------------------------- mysql:バイナリの(rpmでないやつ)4.0.24-standard OS:Linux 2.4.20-31.9(REDHAT) DBD:DBD-mysql-2.9004

    • ベストアンサー
    • Perl
  • mysql 最大値 取得 

    mysqlのデータベースから、列の最大値を取り出したいのですが、 以下のように書いているのですが、取得される値が1しか返ってこないです。 間違っているところはあるでしょうか? perlで書いています。 my $dbh = DBI->connect("DBI:mysql:host=${db_host};database=${db_name}", $db_user, $db_pass); my $sth = $dbh->prepare("SELECT MAX(列名) FROM テーブル名"); my $rv = $sth->execute(); print "$rv";

    • ベストアンサー
    • MySQL