備忘。
事象
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を触っていこうと思います。
コメント