13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SQLAlchemyでのデータ挿入と取り出しで文字コードにハマる

Posted at

##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^)/

13
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?