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

mysql:13238

From: "Tetsuro IKEDA" <"Tetsuro IKEDA" <ikdttr@xxxxxxxxxx>>
Date: Fri, 11 Aug 2006 01:12:42 +0900
Subject: [mysql 13238] Re: FEDERATEDストレージ・エンジンでの日本語取り扱い

たびたび池田です。

とりあえず文字化けの原因等、現時点で分かったことをまとめておきます。

FEDERATEDエンジンを使うと、CREATE TABLE時、およびクライアント側の
MySQLを起動してから初めてSELECTを対象テーブルに行うときに、
クライアント側はマスタ側へ接続を行います。

この時、単純にmysql_real_queryを呼んでいるだけであるため、
charsetについては、コンパイル時のdefault charsetをクライアント側の
charsetとしてデータを受け取りにいきます。

例えばマスタ側のテーブルがutf8であり、クライアント側のテーブル定義も
utf8であったとしても、ここで使用している接続のcharsetが"default charset"
(例えばlatin1とか)であるため、default charset次第で文字化けが発生します。

マニュアル&ソースの流し読みをした限りでは、これを制御する方法は
なさげでした。

解決法としては、館山さんも仰っているように、default charsetが同じに
なるようにコンパイルするという方法がまずあります。

しかしそれだと独自コンパイルをすることになり、MySQL ABが配布している
バイナリとかが使えません。

そこで、他に何か方法がないかということで、前回のメールで触れたのが、
マスタ側のmy.cnfに"init-connect=set names utf8"などを仕込んで
置く方法でした。

これを仕込んでおくと、クライアント側のmysqldがマスタ側のmysqldに接続
した際に、接続のcharsetが指定のcharsetになるため、文字化けを回避できます。

が、しかしこの方法は不完全な方法と言うこともわかりました。
この方法は、以下の場合に文字が化けてしまいます。

・テーブル作成ののち、クライアント側mysqldとマスタ側のmysqldとの接続が
 なんらかの理由により切断してしまった場合。

このとき、クライアント側mysqldに対してアプリサーバ等がSELECTを発行した
タイミングで、mysqlクライアントAPIの自動再接続機能により、裏でこっそり
接続が再度行われて、データを取得し、返すという処理が起こります。

この自動再接続処理は、mysqlクライアントAPIのmysql_reconnect関数が
行うのですが、この関数は接続を作成しなおすと、"SET NAMES"コマンドを
発行します。そしてこのSET NAMESコマンドが使用するcharsetは、
default_charasetです。つまりここで"SET NAMES latin1"とかになる可能性があります。

これにより文字化けが発生した場合、以下のような方法で解消できますが、
・クライアント側のmysqldを再起動
・クライアント側のテーブルを削除して作り直し
よろしくないですよね。

という感じで、今のところカスタムビルドしか解決方法がないのではと思いました。

長くなりましたが、いじょ。

06/08/10 に Tetsuro IKEDA<ikdttr@xxxxxxxxxx> さんは書きました:
> 池田です。
>
> 自己レスです。
> 先ほどは"--init-connect=set names utf8"と言いたかったのですが、
> 手元で試したところ駄目でした。一般クエリログに以下のようにでます。
>
> 2 Query       set names cp932
> 2 Query       SET NAMES latin1
> 2 Query       SHOW TABLE STATUS LIKE 'StaffV'
> 2 Query       SELECT `No`, `Name`, `UserName` FROM `StaffV`
>
> latin1で上書きされちゃってます。
>
> 06/08/10 に Tetsuro IKEDA<ikdttr@xxxxxxxxxx> さんは書きました:
> > 池田です。
> >
> > FEDERATEDエンジンは、ha_federated.cppをさらっと見た感じでは、
> > mysqlクライアントAPIを使って普通にconnectしてselectしているようですね。
> >
> > # mysql_real_connect とか
> > # mysql_real_queryとか
> >
> > そこで、これを逆手にとって、マスタ側に--init-connect=utf8とかを仕込む、
> > というのとかはどうでしょう?
> >
> > 思いつきで、手元で試してもいませんが(^^;
> >
> > 06/08/10 に tateyan<tateyan@xxxxxxxxxx> さんは書きました:
> > > たてやんっす
> > >
> > > 現在頭を抱えていることがFEDERATEDストレージ・エンジンでの日本語表示なん
> > > です。(FEDERATEDストレージ・エンジンは5.0からの機能)
> > > mysqlのバージョンは5.0.22を使ってます
> > >
> > > コンパイル時に明示的に--with-charset=utf8と指定して動作させているサーバ
> > > 同士だとうまく行くのですが、このコンパイルオプションを指定して居ないサー
> > > バ相手になると、テーブルの中の日本語が???? になってしまいうまく取得でき
> > > ないという部分です
> > >
> > >
> > > マスターサーバ
> > > create table `StaffV` (
> > > No  varchar(4) NOT NULL ,
> > > Name varchar(64),
> > > UserName varchar(64),
> > > PRIMARY KEY  (No)
> > > );
> > >
> > > クライアントサーバ
> > > create table `StaffV` (
> > > No  varchar(4) NOT NULL ,
> > > Name varchar(64),
> > > UserName varchar(64),
> > > PRIMARY KEY  (No)
> > > ) ENGINE=FEDERATED DEFAULT CHARSET=utf8
> > > CONNECTION='mysql://username:password@xxxxxxxxxx:3306/DataBase/StaffV';
> > >
> > >
> > > データの中身は
> > > 'S001','tateyan','舘山 聖司'
> > > 'A001','hogehoge','穂下 太郎'
> > >
> > > っていった感じ
> > >
> > > これで
> > > マスター クライアント 日本語表示
> > > utf8      utf8          OK
> > > utf8      無指定        NG
> > >
> > > となってしまってます
> > >
> > > 要求としてはコンパイルに関わらずクライアント側のサーバ上で日本語文字表示
> > > (utf8)を表示させたいのですが
> > >
> > > mysql --default-character-set=utf8 DataBase
> > > としてもNGです
> > >
> > > 現在の仕様としてはコンパイル時に--with-charset=utf8と文字指定が必要とい
> > > うことなのかなぁ?と...
> > > 何か見落としているかなぁ^_^;
> > >
> > >
> > > --
> > >   彡彡从        たてやんっす
> > >  d□/□-b      <tateyan@xxxxxxxxxx>
> > >  ヽ"ー"丿
> > >
> > > Key fingerprint = 5D56 8EA3 B9FE A721 4866  FB4A 0041 672C 08DD C33A
> > >
> > >
> > >
> >
>

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

     13235 2006-08-10 22:41 [tateyan <tateyan@xxx] FEDERATEDストレージ・エンジンでの日本語取り扱い
     13236 2006-08-10 22:57 ┗["Tetsuro IKEDA" <ikd]                                       
     13237 2006-08-10 23:22  ┗["Tetsuro IKEDA" <ikd]                                     
->   13238 2006-08-11 01:12   ┗["Tetsuro IKEDA" <ikd]                                   
     13239 2006-08-11 22:39    ┗[Tetsuro IKEDA <te.ik]                                 
     13240 2006-08-11 22:57     ┗[tateyan <tateyan@xxx]                               
   @ 13242 2006-08-14 17:39      ┗[<ska_king2005@xxxxxx]                             
     13243 2006-08-14 18:04       ┗["Tetsuro IKEDA" <ikd]                           
     13244 2006-08-15 10:06        ┗[<ska_king2005@xxxxxx]                         
     13245 2006-08-15 12:25         ┗[Tetsuro IKEDA <te.ik]                       
     13246 2006-08-15 16:31          ┗[<ska_king2005@xxxxxx]