はじめまして。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
-~----------~----~----~----~------~----~------~--~---

メールによる返信