有谁知道为什么latin1_swedish是MySQL的默认值.在我看来,UTF-8会更兼容吗?
通常选择默认值是因为它们是最好的通用选择,但在这种情况下,它们似乎并不是他们所做的.
我对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