[前][次][番号順一覧][スレッド一覧]

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]