データベースのスキーマを作成するために sqlalchemy を使用しています。何を試しても、utf-8 の使用を強制することに成功しません。
これは、私の問題を再現する最小限の python スクリプトです。
from sqlalchemy import create_engine, Column, Unicode
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('mysql+mysqldb://user:password@localhost/multidic?charset=utf8', echo=True)
Base = declarative_base()
class MyTableName(Base):
__tablename__ = "mytablename"
test_column = Column(Unicode(2),primary_key=True)
Base.metadata.create_all(engine)
このスクリプトを実行した後、データベースを調べると、エンコーディングが utf-8 ではなく latin1 であることがわかります。
mysql> SHOW FULL COLUMNS FROM mytablename;
+-------------+------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+-------------+------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| test_column | varchar(2) | latin1_swedish_ci | NO | PRI | NULL | | select,insert,update,references | |
+-------------+------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
1 row in set (0.00 sec)
作成された列のタイプを変更しようとしました(Unicodeの代わりにString )、 create_engineへの呼び出しに引数encoding = "utf8"を追加しようとしましたが、どれも機能しませんでした。
だから、私の質問は:
sqlalchemy を使用して、MySQL で特定の文字エンコーディング (私の場合は utf-8) の使用を強制するにはどうすればよいですか?
ありがとうございました :)
ノート:
私は sqlalchemy 0.7 と python 2.7 を使用しています。どちらかまたは両方をアップグレードできる可能性がありますが、それが唯一の解決策である場合に限ります!
私はmysql 5を持っていて、utf-8をサポートしています:
mysql> show character set where charset="utf8";
+---------+---------------+-------------------+--------+
| Charset | Description | Default collation | Maxlen |
+---------+---------------+-------------------+--------+
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
+---------+---------------+-------------------+--------+
1 row in set (0.00 sec)