お世話になります。
環境は
windows2000pro
perl 5.8.8
mysql 5.0.22
です。
mysqlの文字コード関連の設定はmy.iniにてsjisに統一してあります。
DBIを使って、perlスクリプトからmysqlのテーブルへ「表」という文字をインサートしようとするとエラーになります。mysqlクライアントからならちゃんと「表」もインサートできました。
エラーは以下のようになっています。
「
You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near ''表\')' at line 1表
」
とにかくインサートしようとする文字列の最後の文字が「表」なら同様のエラーになります。
「表示」なら問題なくインサートできます。表の2バイト目が5cなのがまずいと思うのですが、どう対処すればよいかわかりません。
ヒントを下さい。よろしくお願いします。
-----
use strict;
use DBI;
use Encode qw(from_to);
my $str = "表";
from_to($str,'utf8','shiftjis');
eval {
my $dbh = DBI->connect(
'dbi:mysql:test,hostname=localhost',
'root','bnogl399',{ RaiseError => 1, PrintError => 0});
$dbh->do("set names sjis");
$dbh->do("use mydb");
$dbh->do("insert into foo values (3, " . $dbh->quote($str) . ")");
$dbh->disconnect();
};
print $DBI::errstr if $@;
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
sjisです。
回答にZIPファイルを添付できなかったのでSkyDriveに
置いておきました。
mysqlPPrawSjis.zip
http://cid-78738881dea16832.skydrive.live.com/se …
参考URL:http://cid-78738881dea16832.skydrive.live.com/se …
No.3
- 回答日時:
>use Encode qw(from_to);
の前後に
use utf8;
これで
>my $str = "表";
は問題無し。次に
>$dbh->do("insert into foo values (3, " . $dbh->quote($str) . ")");
これは、prepared statement を使って
my $statement= $dbh->prepare("insert into foo values (?,?)");
$statement->execute(3,$str);
エラー処理のために eval{ ... }; でくるむのがいいと思いますが。
No.2
- 回答日時:
MySQLの環境が無いので試せないのですが、文字列はシングルクォーテーションで囲ってもOKのはず。
何か展開のルールがダブルクォーテーションと違うはず。
うろおぼえでごめんなさい。
なので
my $str = '表';
ではどうでしょう?
こんな時間にどうもありがとうございます。
やってみましたがだめでした。
perlでは""と''では確かに展開のルールが違いますが「\」単独に関しては同じ解釈がされたと思います。
my $str = '表';
としたら表(955c)の2バイト目の5cが\と解釈された
my $str = '95\';
となってしまい、二つ目の'がエスケープされてしまいます。
No.1
- 回答日時:
my $str = "表\";
でどうでしょう?
ありがとうございます。
"表\"としてしまうと最後の"が\でエスケープされてしまい、スクリプトを実行してもごちゃごちゃとしたエラーになります。
そこで
$str = "表\\";
としてみましたが
You have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near ''表\\\')' at line 1表\
と同様なエラーになります。
すみません、書き忘れてしまったのですが、たとえ"表\"がうまくいったとしても、
それでは「表」という文字にしか対応できません。そうではなくて、
表に限らず2バイト目が5cになっている他のあらゆる文字に関しても、
問題なくmysqlで扱えるようにしたいのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 何にかが違うから エラーなんでしょうね! 2 2022/09/18 05:28
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
- MySQL MySQLのテーブル作成でハイフン - は使用できないのでしょうか? 2 2022/10/21 16:50
- MySQL テーブル作成です。どこかのスペルが間違っているか記号など スペースかな? 1 2022/10/01 05:08
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- その他(SNS・コミュニケーションサービス) 自分のpcがハッキングされたようなメールが来たのですがどうすればいいですか? 4 2022/10/02 16:14
- 英語 The Twilight Zone1959に関するCBSの回答について 1 2023/03/02 15:13
- YouTube youtubeからの著作権メールについて 2 2023/02/14 16:12
- 英語 英文の添削お願いします。【長文です。】 マッチングアプリで相手を言い負かしている時のやつです。 色々 1 2023/07/01 02:12
- C言語・C++・C# [至急]Project Euler:#17Number letter countsコード入力出力解説 2 2022/09/24 02:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
LCD ディスプレイを Raspberry ...
-
Perlで画像のサイズ取得する方法
-
ArduinoのジャイロモジュールMP...
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
エクセルVBAでシートモジュール...
-
Excel VBA 『Call』で呼び出す...
-
ユーザー定義関数に#NAME?が返...
-
大量の標準モジュールを解放す...
-
VBAで別モジュールへの変数の受...
-
モジュールの最大数はいくつな...
-
標準モジュールを削除したい。(...
-
Excel VBA 定義されたプロージ...
-
MS-Access と接続する方法を教...
-
VBSがコンパイルエラーになりま...
-
ActivePerl付属のPPMでモジュー...
-
Excel VBAで、ユーザーフォーム...
-
VBAで「メモリが不足しています」
-
VHDLにおける「generic」について
-
ACCESSのVBAでPrivate Sub ~en...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
LCD ディスプレイを Raspberry ...
-
laravel 本番環境でメールが送...
-
perlからDBIを使用したpostgres...
-
エラーでハマっている為、use A...
-
Perlで画像のサイズ取得する方法
-
MySQLとの接続でfetchrow_array...
-
"use CGI::Session"でエラーが...
-
DBD::mysqlで「表」という文字...
-
CGI::Carpを使っているのにInte...
-
DBIが入っているはずですが、、、
-
perlで指定か所のurlを取り出し...
-
Chart::Gnuplotの使い方
-
failed: Can't connect to loca...
-
PerlコマンドでURLからサムネイ...
-
htmlフォームから受け取ったフ...
-
WWW::Mechanizeがプロシキ経由...
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
ユーザー定義関数に#NAME?が返...
-
VBAで別モジュールへの変数の受...
おすすめ情報