mysql:3311
From: "Kawai,Takanori" <"Kawai,Takanori" <GCD00051@xxxxxxxxxx>>
Date: Wed, 21 Feb 2001 22:28:41 +0900
Subject: [mysql 03311] ODBC ドライバ MySQL-SJIS ドライバでのパラメータ利用について
はじめまして、川合孝典と申します。 いきなりで長文になってしまって申し訳ないんですが。 ----- Original Message ----- From: "KAYO NODA" <kayon@xxxxxxxxxx> Sent: Wednesday, February 21, 2001 5:19 PM Subject: [mysql 03308] ASP+MySQL で SQL実行時にエラー > はじめまして。 > 野田と申します。 (中略) > 例えば、能という文字が含まれ、前に違う文字がある場合。 > ○能という場合に必ずエラーが起きます。 > 能力などのように、能○のときは、起こりません。 (以下略) という件について自分でも調べていたのですが、MySQL-SJISとMySQL-EUC とで動きが違う所まではわかりました。よくわからないのはMySQL-SJISを 利用した場合にパラメータが使えないようなのです。 何か設定が足りないのでしょうか? ここからが長くなってしまうのですが... スクリプト1でいくつかの手法で比較してみました。 結果、DBD::Oracle, DBD::mysql, DBD::ODBC+MySQL-EUCだと問題ないのに DBD::ODBC+MySQL-SJISではうまく動きません。 そこでスクリプト2のように\\でエスケープして埋め込むと動かすことは できました。しかしパラメータで渡すとうまく動きませんでした。 ついでにスクリプト3のようにWSH(VBScript)で試してみたところ、 ADO(ODBC)+MySQL-EUCでは、当然のように問題ありませんでした。 しかしスクリプト4のようにADO(ODBC)+MySQL-SJISでは、エスケープ させることにより埋め込みの方のエラーはでなくなりましたが、文字化け します。さらにパラメータを利用しているところでのエラーをはずすことは できませんでした。 [環境] サーバー: OS : TurboLinux Workstation 6.0 MySQL : mysql-3.23.28-gamma-pc-linux-gnu-i686: クライアント: MySQL ODBC ドライバ: myodbc-2.50.29-jp.zip を解凍しインスール ActivePerl Build 620 DBI :: 1.14 DBD::mysql 2.0400 DBD::ODBC 0.28 [スクリプト1] use strict; use DBI; sub TestPtn($;$); print "----------------\n"; print "PTN0 DBD::Oracle:\n"; print TestPtn('dbi:Oracle:ORCL'), "\n"; print "----------------\n"; print "PTN1 DBD::mysql:\n"; print TestPtn('dbi:mysql:database=test;host=lins'), "\n"; print "----------------\n"; print "PTN2 MySQL-SJIS Driver:\n"; print TestPtn('dbi:ODBC:MySQL'), "\n"; print "----------------\n"; print "PTN3 MySQL-EUC ODBC Driver:\n"; print TestPtn('dbi:ODBC:MySQLE', 1), "\n"; sub TestPtn($;$) { my($sDsn, $iEuc) =@_; my $sRes = 'OK:'; my $hDb = DBI->connect($sDsn, 'scott', 'tiger',{RaiseError=>1})|| die $DBI::errstr; my $hSt; my @aItem = ('能力', '○能\'); eval { $hDb->do('DELETE FROM TITLES'); #1) 直接埋め込み my $s0 = $hDb->quote($aItem[0]); my $s1 = $hDb->quote($aItem[1]); $hSt = $hDb->do("INSERT INTO TITLES VALUES ($s0, $s1)"); #2) パラメータ $hSt = $hDb->prepare('INSERT INTO TITLES VALUES (?, ?)'); $hSt->execute(@aItem); }; if($@) { $sRes = 'NG:' . $@; } $hSt = $hDb->prepare('SELECT * FROM TITLES'); $hSt->execute(); while(my $raData = $hSt->fetchrow_arrayref()) { print join(":", @$raData), "\n"; } $hSt->finish() if($hSt); $hDb->disconnect() if($hDb); return $sRes; } [実行結果1] ---------------- PTN0 DBD::Oracle: 能力:○能 能力:○能 OK: ---------------- PTN1 DBD::mysql: 能力:○能 能力:○能 OK: ---------------- PTN2 MySQL-SJIS Driver: NG:DBD::ODBC::db do failed: [TCX][MyODBC]You have an error in your SQL syntax near ''○能')' at line 1 (SQL-42000)(DBD: st_execute/SQLExecute err=-1) at tins.pl line 31. ---------------- PTN3 MySQL-EUC ODBC Driver: 能力:○能 能力:○能 OK: [スクリプト2] use strict; use DBI; my $hDb = DBI->connect('dbi:ODBC:MySQL', 'scott', 'tiger',{RaiseError=>1})|| die $DBI::errstr; my $hSt; my $sRes = 'OK:'; my @aItem = ('能\\\力', '○能\\\'); eval { $hDb->do('DELETE FROM TITLES'); #1) 直接埋め込み my $s0 = $hDb->quote($aItem[0]); my $s1 = $hDb->quote($aItem[1]); my $sSql = "INSERT INTO TITLES VALUES ($s0, $s1)"; print "SQL:$sSql\n"; $hSt = $hDb->do($sSql); #2) パラメータ $hSt = $hDb->prepare('INSERT INTO TITLES VALUES (?, ?)'); $hSt->execute(@aItem); }; if($@) { $sRes = 'NG:' . $@; } $hSt = $hDb->prepare('SELECT * FROM TITLES'); $hSt->execute(); while(my $raData = $hSt->fetchrow_arrayref()) { print join(":", @$raData), "\n"; } $hSt->finish() if($hSt); $hDb->disconnect() if($hDb); print $sRes; [実行結果2] SQL:INSERT INTO TITLES VALUES ('能\力', '○能\') 能力:○能 NG:DBD::ODBC::st execute failed: [TCX][MyODBC]You have an error in your SQL syntax near ''○能\\')' at line 1 (SQL-42000)(DBD: st_execute/SQLExecute err=-1) at tin2.pl line 20. [スクリプト3] Option Explicit Dim Cn, Cmd, prm1, prm2 Dim nou1,nou2 'Createのオブジェクト Set Cn = CreateObject("ADODB.Connection") Set Cmd = CreateObject("ADODB.Command") Set prm1 = CreateObject("ADODB.Parameter") Set prm2 = CreateObject("ADODB.Parameter") 'コネクト Cn.open "MySQLE","scott","tiger" Set Cmd.ActiveConnection = Cn nou1 = "能力" nou2 = "○能" Cmd.CommandText = _ "INSERT INTO TITLES VALUES('" & nou1 & "', '" & nou2 & "')" Cmd.Execute Cmd.CommandText = "INSERT INTO TITLES VALUES(?, ?)" Cmd.CommandType = 1 'adCmdText Cmd.Prepared = True '最初のパラメータ設定 Set prm1 = Cmd.CreateParameter("Type", 129, 1, 10, nou1) Cmd.Parameters.Append prm1 Set prm2 = Cmd.CreateParameter("Title_id", 129, 1, 10, nou2) Cmd.Parameters.Append prm2 Cmd.Execute [スクリプト4] Option Explicit Dim Cn, Cmd, prm1, prm2 Dim nou1,nou2 'Createのオブジェクト Set Cn = CreateObject("ADODB.Connection") Set Cmd = CreateObject("ADODB.Command") Set prm1 = CreateObject("ADODB.Parameter") Set prm2 = CreateObject("ADODB.Parameter") 'コネクト Cn.open "MySQL","scott","tiger" Set Cmd.ActiveConnection = Cn nou1 = "能\力" nou2 = "○能\" Cmd.CommandText = _ "INSERT INTO TITLES VALUES('" & nou1 & "', '" & nou2 & "')" Cmd.Execute Cmd.CommandText = "INSERT INTO TITLES VALUES(?, ?)" Cmd.CommandType = 1 'adCmdText Cmd.Prepared = True '最初のパラメータ設定 Set prm1 = Cmd.CreateParameter("Type", 129, 1, 10, nou1) Cmd.Parameters.Append prm1 Set prm2 = Cmd.CreateParameter("Title_id", 129, 1, 10, nou2) Cmd.Parameters.Append prm2 Cmd.Execute ============================================== 川合 孝典(Hippo2000) GCD00051@xxxxxxxxxx kwitknr@xxxxxxxxxx http://member.nifty.ne.jp/hippo2000 ==============================================
-> 3311 2001-02-21 22:28 ["Kawai,Takanori" <GC] ODBC ドライバ MySQL-SJIS ドライバでのパラメータ利用について 3313 2001-02-22 02:18 ┗["KAYO NODA" <kayon@x] 3314 2001-02-22 07:12 ┗["Kawai,Takanori" <GC] 3317 2001-02-22 16:20 ┗["KAYO NODA" <kayon@x]