【问题标题】:Python encoding issue with pandas read_sql熊猫 read_sql 的 Python 编码问题
【发布时间】:2018-07-03 20:02:04
【问题描述】:

所以我正在尝试将两个字符串编码为 utf-8,以便可以将它们与 pandas.read_sql 一起使用:

selectedTable = "ACC__AccountCodes"
baseSql = "SELECT * FROM FileMaker_Fields WHERE TableName="

现在当我对这两件事进行编码时:

baseSql.encode('utf-8')
selectedTable.encode('utf-8')
sqlString = "{}{}".format(baseSql, selectedTable)

我的输出如下所示:

b'SELECT * FROM FileMaker_Fields WHERE TableName='b'A\x00C\x00C\x00_\x00_\x00A\x00c\x00c\x00o\x00u\x00n\x00t\x00C\x00o\x00d\x00e\x00s\x00''

所以当我使用设置为“latin1”的编码运行它时,我得到了错误:

pandas.io.sql.DatabaseError: Execution failed on sql 'SELECT * FROM FileMaker_Fields WHERE TableName=ACC__AccountCodes': ('HY000', '[HY000] [\x00F\x00i\x00l\x00e\x00M\x00a\x00k\x00e\x00r\x00]\x00[\x00F\x00i\x00l\x00e\x00M\x00a\x00k\x00e\x00r\x00]\x00 \x00F\x00Q\x00L\x000\x000\x000\x007\x00/\x00(\x001\x00:\x004\x007\x00)\x00:\x00 \x00T\x00h\x00e\x00 \x00c\x00o\x00l\x00u\x00m\x00n\x00 \x00n\x00a\x00m\x00e\x00d\x00 \x00"\x00A\x00"\x00 \x00d\x00o\x00e\x00s\x00 \x00n\x00o\x00t\x00 \x00e\x00x\x00i\x00s\x00t\x00.....

我似乎找不到任何解决此问题的方法。我尝试过的一切都让我回到了这一点,这导致了无效语法的 sql 错误。我正在使用 pyodbc ,它期望 utf-8 编码作为输入。想法?

【问题讨论】:

  • 您不需要显式编码。我最近在 Windows 上使用 FileMaker ODBC 设置了 pyodbc,并且 pyodbc 的默认 Unicode 编码(即 UTF-16LE,BTW)运行良好。
  • 好的,谢谢,我再试一次。谢谢!

标签: python python-3.x pandas pyodbc


【解决方案1】:

您不必将它们编码为 utf-8;尝试将它们作为普通字符串传递给 pandas read_sql 函数,它应该可以正常工作,如果没有,那么你在其他地方有问题......但编码不是你想要的。

Pyodbc 正常接受查询中的 unicode 字符串,所以这根本不是你的问题。

我建议还阅读包含某些数据库的特定 unicode 配置的 Unicode section on pyodbc documentation,尽管在您的情况下,我认为这根本不是问题,因为它与数据库驱动程序编码有关,而不是您的 sql 查询,每次都应该是普通的unicode字符串。

【讨论】:

  • 编辑了我的问题。我正在使用 pyodbc,它期望 utf-8 编码作为输入。
  • @L.Norman 你的假设是错误的。我也在使用pyodbc,它在这里与普通的 unicode 字符串一起工作得很好。改为显示您的代码和使用普通 unicode 字符串时遇到的错误。
  • 为什么要先设置编码?
  • 我相信我的数据库输出中有 utf 字符。编辑了我的帖子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-17
  • 2016-04-01
  • 1970-01-01
  • 2019-06-05
  • 2022-11-25
相关资源
最近更新 更多