【发布时间】:2013-09-04 20:27:57
【问题描述】:
我正在使用 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)
运行此脚本后,当我查看数据库时,发现编码是 latin1 而不是 utf-8:
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)
我尝试更改所创建列的类型(String 而不是 Unicode),并尝试添加参数 encoding = "utf8" 在对 create_engine 的调用中,但都不起作用。
所以,我的问题是:
如何通过 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)
【问题讨论】:
-
我记得上次我使用 MySql 时,我最终在 四个 的地方声明了 utf-8,比如在全局 conf 中,在表 def 中,在连接对象上,并且在进行查询时。也就是说,我根本没有理由使用 MySql(THESE IDTS USE LATIN-1 WITH SWEDISH COLLATION AS DEFAULT)。如果我想要一个 SQL 数据库,那么我会使用 Postgresql,它是免费的、良好的文档、合理的设计和快速的。——没有十匹马可以把我拉回 ORM/SqlAlchemy 的潮流;它的功能感觉太复杂了,并且以 SqlA 样式表示的查询*并不比文字 SQL 更具可读性。
标签: python mysql encoding utf-8 sqlalchemy