はじめまして。ayuと申します。 昨晩からturbogearsをさわりはじめました。 DBにはMySQLを使っていますが、例によって日本語をテーブルにinsertする問題ではまってしまいました。 一晩いじりまわしてなんとか解決することができましたので、同様の問題をお持ちの方へのちょっとした参考になると思い投稿いたします。
環境: CentOS4, linux kernel 2.6.9-42 x86_64 mysql4.1.20 python2.4.4 TurboGears1.0b1 SQLObject 0.7.1 kid 0.9.3 MySQL-python 1.2.1 前堤: 書籍の貸出アプリbookrentalを作ろう! MySQLのDB名もbookrentalにした。 * MySQLのencodingはutf8。my.cnfのありとあらゆる箇所に default-character-set=utf8 を指定している。↓ ---------------------- [EMAIL PROTECTED]/install/MySQL-python-1.2.1% cat /etc/my.cnf [mysqld] datadir=/opt/mysql socket=/var/lib/mysql/mysql.sock # Default to using old password format for compatibility with mysql 3.x # clients (those using the mysqlclient10 compatibility package). old_passwords=1 default-character-set=utf8 [mysql.server] user=mysql basedir=/var/lib default-character-set=utf8 [mysqld_safe] err-log=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid default-character-set=utf8 [client] default-character-set=utf8 ---------------------- * その情况で create database bookrental; を行なった。当然dbのencodingもutf8にそろっている。 [EMAIL PROTECTED]/install/MySQL-python-1.2.1% mysql bookrental mysql> status -------------- mysql Ver 14.7 Distrib 4.1.20, for redhat-linux-gnu (x86_64) using readline 4.3 Connection id: 17 Current database: bookrental Current user: [EMAIL PROTECTED] SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 4.1.20 Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: utf8 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8 UNIX socket: /var/lib/mysql/mysql.sock Uptime: 1 hour 5 min 21 sec Threads: 2 Questions: 112 Slow queries: 0 Opens: 13 Flush tables: 1 Open tables: 7 Queries per second avg: 0.029 -------------- * [turbogears-ja:43]で書かれていることを全て実行。 http://www.mail-archive.com/turbogears-ja@googlegroups.com/msg00014.html * sqlobject.dburiには以下を指定 "mysql://[EMAIL PROTECTED]:3306/bookrental?sqlobject_encoding=utf-8&charset=utf8" しかし、この前堤を全て行なってもmodel経由でテーブルに日本語をインサートしようとしても UnicodeEncodeError: 'latin-1' codec can't encode characters in position 59-63: ordinal not in range(256) が発生してうまくいかない。 原因: 調べたところ、MySQLdbで文字コードの指定がうまくいっていないことがわかった。 たとえば >>> con = MySQLdb.connect(db="bookrental", charset="utf8") >>> con.character_set_name() 'latin1' >>> というように、何を文字コードに指定してもlatin1になってしまう。 対策: さらに調べるとSeo Sanghyeonさんという外国の方が、 http://woss.name/2005/11/04/dire-not-understanding-of-unicode/ で解決法をのべていたので、それにしたがってsqlobject.dburiを "mysql://[EMAIL PROTECTED]:3306/bookrental?sqlobject_encoding=utf-8&charset=utf8&read_default_file=/etc/my.cnf" にしたところ、うまく日本語がinsertできるようになりました。 以上、どなたか同様のことでお困りの方にすこしでもお役にたてればと思いますが、なにぶん環境に依存する微妙なお話しですので、今後この手の情報をこういったMLで蓄積していければと思います。 --~--~---------~--~----~------------~-------~--~----~ このメッセージは、次の Google グループへの参加を申し込まれたことを確認 するために送信されました。 Google グループ "turbogears-ja" グループ。 このグループに投稿するには、次の宛先にメールを送信してください。 turbogears-ja@googlegroups.com このグループから退会するには、次へメールをお送りください。 [EMAIL PROTECTED] その他のオプションについては、次の URL からグループにアクセスしてくださ い。 http://groups.google.co.jp/group/turbogears-ja?hl=ja -~----------~----~----~----~------~----~------~--~---