python2.7 + MySQLdbにて以下の様にDB接続を試しています。
DBテーブルにはTEXT型で日本語を含む文字列が格納されています。
DBサーバー(MySQL5.6.22)のデフォルトエンコードはutf8です。
python
1# -*- coding: cp932 -*- 2import MySQLdb 3con = MySQLdb.connect(db="xxx", host="xxx", port=99, user="xxx", passwd="xxx") 4 5# 指定方法(1) 6#con.set_character_set("cp932") 7 8# 指定方法(2) 9#con.query('SET NAMES %s' % "cp932") 10#con.store_result() 11 12curs = con.cursor() 13r = curs.execute("select textData from XXX where key='999'") 14row = curs.fetchone() 15 16with open("result.txt", "w") as f: 17 f.write(row[0])
ここで、最後に出力されたresult.txtを確認してみると、
クライアント(CentOS)の文字コード指定がcp932にも関わらず、utf-8のファイルが取得されてしまいました。
文字コードの指定方法はmy.cnfに以下を記述しているだけです。
[client] default-character-set = cp932
以下、施行錯誤した内容です。
0. 試しに、上記「指定方法(1)」の方法で強制的にcp932を指定してみたところ、全く効果がありませんでした。(相変わらず、utf8でデータが取得される)
0. 次に(1)の方をコメントアウトして、「指定方法(2)」で指定する事でやっとcp932でデータが取得できました。
0. サーバーとクライアントの文字コードが違うと必ず起こる問題なのか?とも思い、別のサーバー(此方はMySQL5.6.23)で同様に試してみたところ、想定通りクライアントの文字コード指定を優先してデータが取得されていました。
※Windowsでもこのソースコードを用いてDBサーバー(MySQL5.6.22)に繋いでみたのですが、やはりutf8で取得されるという事はありませんでした。
※そして、pythonもしくはMySQLdbモジュールの問題かとも思い、mysqlコマンドで直接DB参照してみたところ、やはりある端末はSELECTした際にutf8で表示されてしまう様です。(mysqlコマンドのバージョンは、linuxは全てver 14.14で試しました。)
色々と不可思議な点はあるのですが、最も質問したいのは以下です。
- default-character-setが効かないケースはあり得るのでしょうか?(MySQL)
- con.set_character_set()が効かないケースはあり得るのでしょうか?(python+MySQLdb)
※MySQL5.6.22特有のバグの可能性も考えたのですが、5.6.23ChangeListのBugFixedを見てもそれらしいものは見当たりませんでした…。
環境によってこの様な動きの違いが出る要因として何が考えられるでしょうか。
どなたか知恵をお貸し下さい。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。