16

データベースのスキーマを作成するために 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)
4

2 に答える 2

19

列ごとに特定の照合順序を指定するcollationには、データ型でパラメーターを使用します。

class MyTableName(Base):
    __tablename__ = "mytablename2"
    test_column = Column(Unicode(2),
                         primary_key=True)
    test_column2 = Column(Unicode(2, collation='utf8_bin'))
#                                    ^^^^^^^^^^^^^^^^^^^^

MySQL はこれを、テキストを記述するコードポイントのセットと、テキストのインデックス付けに使用されるソート順の両方として理解することに注意してください。'utf8' や 'utf-8' のような通常の疑わしいものは、MySQL には馴染みがないでしょう (SHOW COLLATION完全なリストを見るために使用してください)。

mysql> show full columns from mytablename2;
+--------------+------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| Field        | Type       | Collation         | Null | Key | Default | Extra | Privileges                      | Comment |
+--------------+------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| test_column  | varchar(2) | latin1_swedish_ci | NO   | PRI | NULL    |       | select,insert,update,references |         |
| test_column2 | varchar(2) | utf8_bin          | YES  |     | NULL    |       | select,insert,update,references |         |
+--------------+------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
2 rows in set (0.00 sec)

mysql> 
于 2013-09-01T18:17:47.393 に答える