C#2.0時代のゲームプログラミング(39)

yaneurao2006-06-13


今回はC#からODBCドライバ経由でMySQLを使う話。


MySQLODBCまわりの話は、バージョンがいくつもあって、インターネットで探していても載っている情報はobsolete時代遅れだったりする。なかなか自分の欲しい情報が見つからない。特に.NET絡みとなるとさらに情報は少なくなる。
データベース実践講義 ―エンジニアのためのリレーショナル理論 (THEORY/IN/PRACTICE)



いまC#側から、MySQL4.1に対して create tableでucs2(≒Unicode)の文字列フィールドを持ったテーブルを作成する。このとき、char[4]は漢字4文字が入るはずだ。


ところが、MySQLはインストール時のdefaultはlatin1なので文字列が1バイト1文字計算になり、実際は2文字しか格納されない。詳しい人に聞いたところ「C#側からMySQLに対して set names sjis; などとして2バイト1文字計算であることを示す必要がある」とのことだ。実際、これで正しく漢字4文字がchar[4]に格納されるようになる。


だが私の疑問は解消しない。何故sjis*1を指定する必要があるのか?set names ucs2;だと駄目なのか?


試してみたがset names ucs2;を指定するとうまく動かない。MySQLのfront endはucs2に対応していないようだ。


一時的な制限:UCS-2 はクライアントキャラクタセットとしては(まだ)使用できません。
つまり、SET NAMES ucs2 は有効ではないということです。

C#の内部ではucs2でMySQLのbackendもucs2のはずなのに途中経路がsjisになっているのは大変気持ちが悪い。国際化対応アプリを作っているはずがsjisにしか対応していないのは気分もよろしくない。


MySQLのfrontendがucs2に対応していないのはいいとしても、ODBC(MySQL用のODBCドライバ。Connector/ODBC 3.51。以下、単にODBCドライバと書く)のbackendとMySQLのfrontendとがsjisでやりとりしているのは何故だ?こっちはsjisなんて指定していない。誰がいつsjisを指定したのか?(つづく)

*1:正確にはCodePage932か? 本文中は単にsjisと記す。MySQLでは実運用上の理由によりsjisとCP932とを厳密に区別している。顕著なのは '\' の扱い。