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
encoding是用于在 SQLAlchemy 中编码/解码的编解码器。从文档:
对于检测到 DBAPI 不支持 Python
unicode对象的那些场景,此编码用于确定源/目标编码。它不用于DBAPI 直接处理 unicode 的情况。[...]
要正确配置系统以容纳 Python
unicode对象,应将 DBAPI 配置为在适当的情况下最大程度地处理 unicode [...]
mysql-python 直接处理 unicode,因此无需使用此设置。
charset是特定于 mysql-python 驱动程序的设置。从文档:
此字符集是连接的客户端字符集。
此设置控制服务器上的三个变量,具体来说character_set_results,这是您感兴趣的。设置后,字符串作为unicode对象返回。
请注意,这仅适用于数据库中有 latin1 编码数据的情况。如果您已将 utf-8 字节存储为 latin1,则使用它可能会更好encoding。
这对我有用。
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)
我有同样的问题。我刚刚在 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)
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)
| 归档时间: |
|
| 查看次数: |
10123 次 |
| 最近记录: |