【Python】mysqlclientでutf-8を使う方法

Python
スポンサーリンク

備忘。

 

スポンサーリンク

事象

mysqlclientを無事導入し、早速使ってみようと思い適当にpythonで書いてみました。

# coding:utf-8

import MySQLdb

#データベースへの接続とカーソルの生成
connection = MySQLdb.connect(
  host = localhost,
  user = root,
  passwd = passw0rd,
  db = dev_ansible)
cursor = connection.cursor()

#対象
#DB名:dev_ansible
#テーブル名:tbl_env
#カラム:<id_env_name(char256)><comment(text)>

#ここに実行したいコードを入力
cursor.execute('INSERT INTO dev_ansible.tbl_env (env_name, comment) VALUES (\'DEV\', \'開発環境\');')
cursor.execute('SELECT * FROM dev_ansible.tbl_env;')

for row in cursor:
  print(row)

#閉じる
connection.commit()
connection.close()

やっていることは簡単。

tbl_envというテーブルに新しいレコードを登録しているだけです。

tbl_envのカラムについてはここでは重要ではないため省略。

んで、実行してみました。

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 68-71: ordinal not in range(256)

んなあ~

 

原因?

エラーを見ると、内容的には文字コードが「latin-1」のところに4byte文字を書き込もうとしたため失敗しているように見えます。

しかし、以前の記事でも書いた通りMariaDBの文字コードはutf-8に変更済み。

なんでや?と考えてたら、こちらのサイトにヒントがありました。

これは、後述する観測結果から、どうやら mysqlclient と MariaDB の接続に使われる文字コードが latin-1 (ASCII) になっているからのように思える。

https://blog.amedama.jp/entry/2016/06/07/234106

う~ん、なるほど?

よくわからないけど、mysqlclientを使用すると文字コードがlatin-1になってしまう、ということですね。

 

対策

これをutf-8に変更するには、以下を追加すればOK。

# coding:utf-8

import MySQLdb

#データベースへの接続とカーソルの生成
connection = MySQLdb.connect(
  host = localhost,
  user = root,
  passwd = passw0rd,
  db = dev_ansible,
  charset="utf8") #←追加
cursor = connection.cursor()

#対象
#DB名:dev_ansible
#テーブル名:tbl_env
#カラム:<id_env_name(char256)><comment(text)>

#ここに実行したいコードを入力
cursor.execute('INSERT INTO dev_ansible.tbl_env (env_name, comment) VALUES (\'DEV\', \'開発環境\');')
cursor.execute('SELECT * FROM dev_ansible.tbl_env;')

for row in cursor:
  print(row)

#閉じる
connection.commit()
connection.close()

charset=”utf8″

ってやつを接続するときに使用すればいいっぽいです。

 

とりあえずこれでクリアできたので、引き続きmysqlclientを触っていこうと思います。

 

[itemlink post_id=”1452″]

 

 

コメント

タイトルとURLをコピーしました