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

mysql:13910

From: goungoun <goungoun <gounx2@xxxxxxxxxx>>
Date: Wed, 25 Apr 2007 15:24:42 +0900
Subject: [mysql 13910] Re: Access2002+MyODBCでエラー

こんにちは。

# 興味本位でソース追いかけただけで、
# myodbcもmysqlをsjis,cp932でも使ったことありません。
# utf8とeuc使うだけですが、それでも文字化けで悩むことは
# よくあるんですけど(苦笑

On Tue, 24 Apr 2007 13:21:19 +0900
"fujita" <t-fujita@xxxxxxxxxx> wrote:

> こんにちは。藤田です。
> 
> > MyODBC3.51.6/MyODBC3.51.9をインストールしてみたのですが
> > 残念なことに現象は変わりませんでした。
> そうでしたか・・・。
> 当方の環境がAccess97 or 2000 or 2003 で sjis なのでそこが
> 結果が違う原因でしょうか?
> 
> 
> ちなみに蛇足ですが以前に3.51.12のソースを少し調べたときにexecute.cの445行目
> 
>   case SQL_CHAR:
>   case SQL_VARCHAR:
>   case SQL_LONGVARCHAR:
>   case SQL_BINARY:
>   case SQL_VARBINARY:
>   case SQL_LONGVARBINARY:
>       {
>           to= add_to_buffer(net,to,"'",1);
>           to= mysql_odbc_escape_string(mysql,
>                                        to, (net->max_packet -
>                                             (ulong) (to - (char*) 
> net->buff)),
>                                        data, length,
>                                        (void*) net, extend_escape_buffer);
>           if ( to ) /* escape was ok */
>           {
>               to= add_to_buffer(net,to,"'",1);
>           }
>           return to;
>       }
> 
> が怪しいと思ったのですが・・・実力不足で判明しませんでした。
> 

# 余談ですが、SQL_*BINARY もエスケープするんですね。

mysql-connector-odbc-3.51.12-win-src.zip
MyODBC-3.51.09.tar.gz
(09は、公式で見つけることができなかったので、ネットから適当に
拾ってきました。svnにあるのかもだけど手抜きです)
で比較してみました。上記の部分は09、12共に同じコードでした。

mysql_odbc_escape_string がくさいのかなと探してみたのですが、
odbcのソースには含まれていませんでした。

ということで、mysql-5.1.17-beta.tar.gz を探してみると

----------------------------------------------------------------
char * STDCALL
mysql_odbc_escape_string(MYSQL *mysql,
			 char *to, ulong to_length,
			 const char *from, ulong from_length,
			 void *param,
			 char * (*extend_buffer)
			 (void *, char *, ulong *))
{
  char *to_end=to+to_length-5;
  const char *end;
#ifdef USE_MB
  my_bool use_mb_flag=use_mb(mysql->charset);
#endif

  for (end=from+from_length; from != end ; from++)
  {
    if (to >= to_end)
    {
      to_length = (ulong) (end-from)+512;	/* We want this much more */
      if (!(to=(*extend_buffer)(param, to, &to_length)))
	return to;
      to_end=to+to_length-5;
    }
#ifdef USE_MB
    {
      int l;
      if (use_mb_flag && (l = my_ismbchar(mysql->charset, from, end)))
      {
	while (l--)
	  *to++ = *from++;
	from--;
	continue;
      }
    }
#endif
    switch (*from) {
    case 0:				/* Must be escaped for 'mysql' */
      *to++= '\\';
      *to++= '0';
      break;
    case '\n':				/* Must be escaped for logs */
      *to++= '\\';
      *to++= 'n';
      break;
    case '\r':
      *to++= '\\';
      *to++= 'r';
      break;
    case '\\':
      *to++= '\\';
      *to++= '\\';
      break;
    case '\'':
      *to++= '\\';
      *to++= '\'';
      break;
    case '"':				/* Better safe than sorry */
      *to++= '\\';
      *to++= '"';
      break;
    case '\032':			/* This gives problems on Win32 */
      *to++= '\\';
      *to++= 'Z';
      break;
    default:
      *to++= *from;
    }
  }
  return to;
}
----------------------------------------------------------------
がありました。

期待する正常動作は、、、
"十"(0x8f5c)をマルチバイトと判断してcontinue(エスケープ処理をスキップ)

問題が発生しているのは、、、
マルチバイトと判断されず、\(5c)に反応して、
8f 5c → 8f 5c 5c → "十\"

ということでしょうか。

〜〜〜

mysql_odbc_escape_string がくさいと仮定すると・・・

myodbc本体に、mysql_odbc_escape_string は静的にリンク
されてるんですかね?
もっとも、静的にリンクされているからこそ

[mysql 13899] の

On Tue, 24 Apr 2007 20:58:23 +0900
"fujita" <t-fujita@xxxxxxxxxx> wrote:
> 藤田です。
> 
> すみません、もう少し引っ張らせて下さい。
> 私の環境でためしたところですが、
> 
> (Access97 or 2000 or 2003) + MyODBC 3.51.9 ではエラーにならず、
> (Access97 or 2000 or 2003) + MyODBC 3.51.12 以降ではエラーになります。
> 
> サーバーは全て同一で、クライアントPCのODBCを入れ替えただけで結果が
> 異なるのでAccessの問題とは言い切れないと思うのですがいかがでしょうか?

のように、myodbc*だけ*を変更した
だけで、問題が発生したりしなかったりするんでしょうけど。。。

# 最初の仮定があてずっぽなので、推測してもあれなんですが・・・

〜〜〜

ところで、素朴な疑問なのですが、

myodbcから(というか上位アプリのaccessなど含めてですが)は、
「SHOW VARIABLES LIKE 'char%';」
は実行できないのでしょうか?

誰が(access?odbc?)何をやっているかわからない状況のなか、
キャラクタセットが本当にcp932(というか期待値)になっているのかを
確認したほうがよさそうな気がするのですが。

# 「設定した」ではなく、
# 「設定した上で、実際に問い合わせして本当に期待値になっているか」
# 見た方がよいのでは?という話です。

あと、デバッグ用に myodbcd.dll なんていうのがあるようですね。
詳細ログ取れるようなので、何かヒントになるのかも。。。


ps.
妄想ですが、
SET NAMES binaly
しておいて、エスケープは自分でやってしまう。
・・・とか、ありなのかなぁ。いや、ないんだろうなぁ。
とかとか

-- 
goungoun <gounx2@xxxxxxxxxx>
http://goungoun.dip.jp/app/


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

     13886 2007-04-24 06:05 [<t-fujita@xxxxxxxxxx] Re: Access2002+MyODBCでエラー           
     13890 2007-04-24 11:58 ┗[ezaki <kjc_post@xxxx]                                       
     13891 2007-04-24 13:21  ┣["fujita" <t-fujita@x]                                     
     13897 2007-04-24 19:58  ┃┣[ezaki <kjc_post@xxxx]                                   
->   13910 2007-04-25 15:24  ┃┗[goungoun <gounx2@xxx]                                   
     13912 2007-04-25 16:39  ┃ ┗["fujita" <t-fujita@x]                                 
     13895 2007-04-24 16:22  ┗["T.Hirotsu" <hirotsu]                                     
     13898 2007-04-24 20:09   ┗[ezaki <kjc_post@xxxx]                                   
     13899 2007-04-24 20:58    ┗["fujita" <t-fujita@x]                                 
     13901 2007-04-25 09:44     ┗[ezaki <kjc_post@xxxx]                               
     13902 2007-04-25 10:20      ┣[MITSUGI kiyoshi <kiy]                             
     13904 2007-04-25 11:22      ┃┗[ezaki <kjc_post@xxxx]                           
     13908 2007-04-25 11:44      ┃ ┗[MITSUGI kiyoshi <kiy]                         
     13909 2007-04-25 12:33      ┃  ┗[YuGo <yu.gotou@xxxxx]                       
     13903 2007-04-25 10:40      ┗["T.Hirotsu" <hirotsu]                             
     13907 2007-04-25 11:34       ┗[ezaki <kjc_post@xxxx]