如何在SQLAlchemy的`create_engine`中使用`charset`和`encoding`(创建pandas数据帧)?

tot*_*ico 7 mysql connection-string sqlalchemy pandas

我对SQLAlchemy中的字符集和编码方式非常困惑.我理解(并已阅读)字符集和编码之间的区别,我对编码的历史有一个很好的了解.

我在latin1_swedish_ci中有一个MySQL表(为什么?可能因为这个).我需要创建一个pandas数据帧,在其中我得到正确的字符(而不是奇怪的符号).最初,这是在代码中:

connect_engine = create_engine('mysql://user:password@1.1.1.1/db')
sql_query = "select * from table1"
df = pandas.read_sql(sql_query, connect_engine)
Run Code Online (Sandbox Code Playgroud)

我们开始遇到Š角色的麻烦(对应于u'\u0160'unicode,但我们得到'\ x8a').我希望这可行:

connect_engine = create_engine('mysql://user:password@1.1.1.1/db', encoding='utf8') 
Run Code Online (Sandbox Code Playgroud)

但是,我继续得到'\x8a',我意识到,鉴于编码参数的默认值是有意义的utf8.那么,我试图encoding='latin1'解决这个问题:

connect_engine = create_engine('mysql://user:password@1.1.1.1/db', encoding='latin1')
Run Code Online (Sandbox Code Playgroud)

但是,我仍然得到相同的'\ x8a'.要明确,在这两种情况下(encoding='utf8'encoding='latin1'),我都可以做mystring.decode('latin1')但不能 mystring.decode('utf8').

然后,我重新发现charset了连接字符串中的参数,即'mysql://user:password@1.1.1.1/db?charset=latin1'.在尝试了所有可能的charset和编码组合后,我发现这个工作:

connect_engine = create_engine('mysql://user:password@1.1.1.1/db?charset=utf8')
Run Code Online (Sandbox Code Playgroud)

如果有人能解释我如何正确使用连接字符串中的参数,我将不胜感激charsetencodingcreate_engine

uni*_*rio 8

encoding是用于在 SQLAlchemy 中编码/解码的编解码器。从文档:

对于检测到 DBAPI 不支持 Pythonunicode对象的那些场景,此编码用于确定源/目标编码。它不用于DBAPI 直接处理 unicode 的情况。

[...]

要正确配置系统以容纳 Pythonunicode对象,应将 DBAPI 配置为在适当的情况下最大程度地处理 unicode [...]

mysql-python 直接处理 unicode,因此无需使用此设置。

charset是特定于 mysql-python 驱动程序的设置。从文档

此字符集是连接的客户端字符集

此设置控制服务器上的三个变量,具体来说character_set_results,这是您感兴趣的。设置后,字符串作为unicode对象返回。

请注意,这仅适用于数据库中有 latin1 编码数据的情况。如果您已将 utf-8 字节存储为 latin1,则使用它可能会更好encoding


W.P*_*rin 7

这对我有用。

from sqlalchemy import create_engine
from sqlalchemy.engine.url import URL

db_url = {
    'database': "dbname",
    'drivername': 'mysql',
    'username': 'myname',
    'password': 'mypassword',
    'host': '127.0.0.1',
    'query': {'charset': 'utf8'},  # the key-point setting
}

engine = create_engine(URL(**db_url), encoding="utf8")
Run Code Online (Sandbox Code Playgroud)


Gün*_*kin 7

我有同样的问题。我刚刚在 url 的末尾添加了?charset=utf8mb4

这是我的:

SQL_ENGINE = sqlalchemy.create_engine('mysql+pymysql://'+MySQL.USER+':'+MySQL.PASSWORD+'@'+MySQL.HOST+':'+str(MySQL.PORT)+'/'+MySQL.DB_NAME)
Run Code Online (Sandbox Code Playgroud)

SQL_ENGINE = sqlalchemy.create_engine('mysql+pymysql://'+MySQL.USER+':'+MySQL.PASSWORD+'@'+MySQL.HOST+':'+str(MySQL.PORT)+'/'+MySQL.DB_NAME + "?charset=utf8mb4")
Run Code Online (Sandbox Code Playgroud)


IT *_*man 6

encoding 参数无法正常工作.

因此,正如@doru在此链接中所说,您应该?charset=utf8mb4在连接字符串的末尾添加.像这样:

connect_string = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(DB_USER, DB_PASS, DB_HOST, DB_PORT, DATABASE)
Run Code Online (Sandbox Code Playgroud)