2008年12月29日月曜日

MY SQL 雑記

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);")  

1 件のコメント:

  1. 続き、

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

    返信削除