【问题标题】:pyodbc + MySQL ODBC cannot deal with Unicode database namepyodbc + MySQL ODBC 无法处理 Unicode 数据库名称
【发布时间】:2018-02-20 07:31:05
【问题描述】:

我正在使用

  • pyodbc 3.0.3
  • python 2.7.12
  • GNU/Linux 4.4.0-59-generic x86_64
  • Ubuntu 16.04.1 LTS(Xenial Xerus)
  • unixODBC 2.3.1
  • ODBC 5.3(w) 驱动程序

当尝试在连接字符串中传递 Unicode 数据库名称时出现错误

提供了 Unicode 连接字符串,但驱动程序没有 Unicode 连接函数

我的代码是这样的

# -*- coding: utf-8 -*-

import pyodbc
dbname = u"डाटाबेस"
cstring = "DRIVER={MySQL};SERVER=192.168.8.25;PORT=3306;DATABASE="+dbname+";UID=root;PWD=root;CHARSET=utf8;" \
                                                                          "use_unicode=1"
connect = pyodbc.connect(cstring)

编辑 1:

我已将 pyodbc 更新到 4.0.21 版本。上面的错误消失了,但又出现了一个问题

import pyodbc
dbname = u"डाटाबेस"
cstring = "DRIVER={MySQL};SERVER=192.168.2.243;PORT=3306;DATABASE="+dbname+";UID=root;PWD=support@immune;CHARSET=utf8;" \
                                                                       "use_unicode=1"
connect = pyodbc.connect(cstring, encoding='utf-8')

当我运行它时,我得到了以下错误

error=('HY000', u"[HY000] [unixODBC][MySQL][ODBC 5.3(w) Driver]未知数据库'\xe0\xa4\xa1\xe0\xa4\xbe\xe0\xa4\x9f \xe0\xa4\xbe\xe0\xa4\xac\xe0\xa5\x87\xe0\xa4\xb8' (1049) (SQLDriverConnect)")

【问题讨论】:

  • edit 显示您的问题:您正在运行什么操作系统。您使用的是什么版本的 MySQL ODBC 驱动程序。您是如何安装该驱动程序的。
  • pyodbc 3.0.3 真的很老了。试试pip install pyodbc==4.0.21 看看是否有帮助。
  • 也许:使用 MySQL Connector/Python 而不是 pyodbc 和 MySQL Connector/ODBC
  • 目前,更改库不是一种选择。库的变化可能会导致我们的产品代码发生很大的变化。

标签: mysql python-2.7 unicode odbc pyodbc


【解决方案1】:

我能够通过从 connect 调用中删除 encoding='utf-8' 参数来重现您的问题并避免它。我的测试代码

# -*- coding: utf-8 -*-
import pyodbc
import sys

print("Python version: " + sys.version.replace("\n", ""))
print("pyodbc version: " + pyodbc.version)
cnxn_str = (
    u"Driver=MySQL;"
    u"Server=192.168.1.144;"
    u"Port=3307;"
    u"Database=डाटाबेस;"
    u"UID=root;PWD=whatever;"
)
cnxn = pyodbc.connect(cnxn_str)
print("driver name: " + cnxn.getinfo(pyodbc.SQL_DRIVER_NAME))
print("driver version: " + cnxn.getinfo(pyodbc.SQL_DRIVER_VER))
crsr = cnxn.cursor()

print(crsr.execute("SELECT txt FROM table1 WHERE id = 1").fetchval())

cnxn.close()

生产

Python version: 2.7.12 (default, Dec  4 2017, 14:50:18) [GCC 5.4.0 20160609]
pyodbc version: 4.0.21
driver name: libmyodbc5w.so
driver version: 05.03.0010
उदाहरण

【讨论】:

  • 更改库版本并删除encoding='utf-8' 在我们的产品代码中成功。非常感谢。
猜你喜欢
  • 2017-08-04
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
相关资源
最近更新 更多