UTF-8を MySQLdbで、Insert などした際に、文字化ける。 utf8ではなく、 charset = 'latin1' でかえってくる。
rikiroku氏が、「強引に直し」ている例があるが、再コンパイルが必要らしく、今回パス。
http://rikima.dip.jp:8081/rikima/rikima-blog/categories/python/cbcategory_view?b_start:int=16
ちなみに、cursor.pyを探すのに苦労したので、メモは残そう。
MySQLdbは、YUMを使ったりした標準的?なインストールでは以下にある。(CenOS5)
"/usr/lib/python2.4/site-packages/MySQLdb/cursors.py
cursor.pyのなかで、たくさん関数があるうちの、この関数
def callproc(self, procname, args=()):
長い英文の説明書きがある・・・・
from types import UnicodeType
db = self._get_db()
元々→ #charset = db.character_set_name()
charset = 'utf-8'
↑↑↑ この個所を変えるらしい。
めんどくさいので、従来方式にする。なんで、pythonとmysqlの両方がutf-8仕様なのにと思うが・・・
python2.5では、これも直っているらしいとも聞くが、2.5入れるのもメンドイので、今回はこれで。
↓このブログが詳しい。
http://blog.livedoor.jp/alisue_seiga/archives/74330.html
my.ini
[mysqld] default-character-set=utf8 character_set_server=utf8 skip-character-set-client-handshake
スクリプトの中
connection = MySQLdb.connect(host=,port=,user=,passwd=,db=,use_unicode=True,charset="utf8")
変数をutf-8でとるようにした
hensu = unicode(hensu, 'utf-8', 'ignore')
SQL文をunicode指定してもよいらしい。(メンドイのでしてないが、変数をutf-8にしてあるのでちゃんと動いた。スクリプトファイル自体も -*= coding: utf-8 -*- にしてある)
cursor.execute(u"INSERT INTO person (name,age) VALUES ('例文',10);")

続き、
返信削除スクリプトファイル中のSQL文ですが、
プレーズホルダを使ったものには有効にはならないようです・・・
単純な、Select文くらいならなるのかもしれないですが、
insert で、 ON DUPLICATE KEY UPDATE を使ったものは、ムリでした。単純な文字列と、変数の代入だとOKでした。