« 音源のサポート、少し時間がかかりそうです | メイン | 音源ファイル再生、動かん、何が起こった? »

2016年2月14日 (日)

3日間ハマっていました。

いやぁ~、久しぶりにハマりました。使っているデータベースは MySQL なんですが

スキーマを変更(alter)しようかとも思ったんですけど、動く状態のデータベースを壊すとまずいので、
utf8 で新しいスキーマを作り、バックアップを流し込みました。

・キーにしている文字列項目が長すぎる・・・にひっかりました。utf8 にすると1文字あたりのバイト数が増えるので・・・
・次に、キー全体の長さが長すぎる
文字列項目の長さを調節して何とかしました。
とりあえず「文字化け御免」という事で「Tchaikovsky. Sinfonía nº 5 en Mi m, Op. 64」を入れてみました
ちゃんとDBに書き込めたし表示もOK。

テストに必要な最小限の「補助文字対策」をやって補助文字を入れてみると、DBへの書込み時に「不正な文字」となってしまいました。
調べてみると「MySQL の utf8 は補助文字はサポートしない。補助文字を使うならば utf8mb4 を使え」だと。

で、DBを作りなおすと、また「キーが長すぎる」
MySQL の utf8 は1文字あたり最大3バイト、utf8mb4 は最大4バイト。ちなみに、cp932 は1文字あたり2バイト。
また文字列項目の長さを調整してデータを入れなおしました。

さて、補助文字の入出力のテストなんですが、ここからハマりました。「不正な文字」になってしまうのです。
MySQL の文字コードは結構複雑で、クライアントの文字セット、接続の文字セット、サーバーの文字セット、結果の文字セットなどがあります。
これらが utf8mb4 を扱えなくてはならないのですが、一部の文字セットが utf8 のまま。utf8mb4 になってくれません。

MySQL の構成ファイルや、JDBC のパラメータをどう変更しても utf8 のまま。困ったねぇ。
仕方がない。プログラムでセットするか。という事で、【自分で作った】データベース接続クラスのソースを開けてみました。
そうしたら、なんと、自分で utf8 にセットしていたのです。これ、DBの構成、JDBC の起動後なんで、構成ファイルや起動パラメータを変更しても「手応えなし」なのは当然でした。・・・そういえば・・・

何年か前に、MySQL がややこしい文字コードを扱うように変更された時、
・データベースは CP932
・Java はユニコード
なので、DB接続クラスに utf8 にセットする部分を追加したのを思い出しました。

ったく、しょ~もない。でも、ハマるのって、たいてい原因は「しょ~もない」事なんですよね。

以上、3日かかりました。疲れた。

現状は「限定された条件」付きですが、補助文字をDBに格納する、読み出して表示する、が出来るようになりました。
明日から、まだ手を付けていない部分のプログラムを修正する予定です。

コメント

コメントを投稿