##SQLAlchemyと文字コードにハマる(UTF-8, Unicode)
###問題
自分でMySQLに入れたデータだと問題なくsqlalchemyで取り出して文字化けが起こらないのに、友人からもらったdumpファイルで入れたデータだとsqlalchemyで取り出すと文字化け/(^o^)\
###解決策
sqlalchemyを使ってデータを出し入れする場合、 挿入(insert)と取り出し(select)では必ず同じ文字コード(設定)を使う。
###解説
今回、以下のような基本的?な接続を行おうとしていました。
# -*- coding: utf-8 -*-
from sqlalchemy import create_engine,
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import MetaData
# dbとの接続関連の処理
engine = create_engine('mysql://username:password@localhost/dbname?charset=utf8')
Base = declarative_base()
metadata = MetaData()
Session = sessionmaker(bind=engine)
session = Session()
自分ひとりで出し入れをする分には致命的な問題は起こりません。
ただし、他の人からもらったデータをsqlalchemyで取り扱う場合は注意が必要です。
今回、mysqlのdumpファイルをもらってデータを突っ込んだのですが、sqlalchemy経由で取り出すと文字化けが/(^o^)\
####状態
自分:
create_engine('mysql://username:password@localhost/dbname')
charsetをutf-8にしていない/(^o^)\
相手:
きちんとcharsetをutf-8にしていた。(railsでMySQLにデータを挿入していたため、sqlalchemyは使っていません。)
####どうやったら直ったの?
以下のように書き直しました。
create_engine('mysql://username:password@localhost/dbname?charset=utf8')
最後に?charset=utf8を加えただけです。
ただし、以下の流れはダメです。
(?charset=utf8なしで)データを挿入
↓
(?charset=utf8を付け加えた状態で)データを取り出す
文字化けします。
同じ設定でデータの挿入と取り出しをしましょう。つまり、
(?charset=utf8を加えた状態で)データを挿入
↓
(?charset=utf8を加えた状態で)データを取り出す
こうすれば文字化けは起こりません。
あと、逆もまた然りです。?charset=utf8を付けずにデータを挿入したのであれば?charset=utf8を付けずに取り出しましょう。
なお、?charset=utf8をつけた状態でデータを取り出すと、文字データはUnicodeで返って来ました。?charset=utf8を付けなかった場合はasciiで返って来ました。
早くPython3にしたい\(^o^)/