ワタタツの日記
2009 年 11 月 30 日 (月)
☆ 昨日の mythtv が Illegal mix of collations というエラーを MySQL に連発させる問題が思わぬ方法で解決
昨日の mythtv で select して where で照合するときに Illegal mix of collations というエラー連発 MySQL という問題が、MySQL が大好きな中学から博士課程までの同級生の助言の元に見事に解決しました。助かったー。
簡単にいうと charset=binary とする。それだけ。
そもそもなぜネットに転がる my.cnf で default-character-set=utf8 したりinit-connect = "SET NAMES utf8" したりして、charset を utf8 にする方法が全く効かなかったのか。今回いろいろやった限りおおむね次だと思われます。たぶん。
mythtv はマルチバイトだろうがなんだろうがバイト列としてしか扱わない。データベースの MySQL に入力のまま突っ込むし、出してきたデータはそのまま表示しますと。で、MySQL が 5.0 のときは latin1 は 7bit 以外は何も考えずに通していた?のでうまくいっていたが 5.1 になってちゃんと見るようになったので mythtv 的にだめになったと。たぶん。
昔のデータの dump を見ていたら全部データベースは CHARSET=latin1 になっているし、日本語のところは nkf -w してもうまく見えないデータになっていてあれーもしかしてこれって生データなのかなーと思いました。そうするとその同級生が latin1_bin のようなことでやればいいのではと助言。とりあえず COLLATE=latin1_bin ではだめだったんですが、charset=binary というのがあってそれを使ってみてはどうかということがありました。
それで結局 my.cnf で設定していた utf8 の部分を全部 binary に置き換えてみたらキターーーー!!! という感じでうまく行きました。あとでいる行を探してみたら、必要だったのは[mysqld]部分に
init-connect = "SET NAMES binary"とすることのみでした。
ただ、これだと mythtv はいいけど他の MySQL を使うプログラムが困ってしまうかもしれません。でも skip-character-set-client-handshake をしていないので、プログラムで個別に指定してやればいいのではと思います。
上記の illegal mix of collations は mythfilldatabase で出ているのに気づいたので、それをするには mythfilldatabase で charset=binary とするにはソースをいじるしかないかなあ。
それから mythweb といって、web から mythtv を操作するインタフェイスをほとんど使っているんですが、それはただの php なので set names binary をすることは可能です。
ちなみに MySQL は 5.1.36、mythtv は 0.21 です。
本当はエンコードを込みで mythtv が文字列を正しく扱うのが正しいんじゃないかとは思いますが、今のところはうまく行かなかった理由もだいたいたぶんわかったし動くようになったし結果 alright という感じです。
それから面白かったのは、解決してもチャンネルにつけた名前は文字化けしたままだったのですが、それはちょっと名前を変更したりしていたので、それは本当に utf8 な文字列としての化けた文字列が格納されてしまったということだと思います。TSSテレムこういうの。元はデータは正しくてもエンコードがおかしくて文字化けしていたものが、編集したのでそれを utf8 として表現したバイト列が mysql に格納されたというわけです。見た目には同じなので戸惑うかもしれません。
☆ 東広島英語部、ついに活動開始
どうも東広島英語部という謎の団体を作って部長を勝手にやっておるものです。それぞれいろいろな方法で英語をされている人たちの中で、勉強したことや勉強方法や失敗談などを紹介しあったら面白いしためになるし motivated だなあと思って作られた部です。なんと、できてから今までに部員が5倍にふくれあがっています!!!!!
そんな東広島英語部、今までは mixi のコミュニティの掲示板のみでしたけど、ついに勉強会と称して勉強したことや勉強方法や失敗談を紹介しあう会合の第0回キックオフをやります。12月6日日曜午後予定で場所は下見付近で未定です。ご興味のおありの方は是非ともご連絡ください。