我正在尝试从MySQL数据库中提取一个表名列表。代码的相关部分如下:
conn = pyodbc.connect('...')
cursor = conn.cursor()
for table in cursor.tables():
print table.table_name
对于每张桌子,它会打印出一堆乱码(钻石中的方框和问号)。使用repr(table.table_name)
打印:
u'\U00500041\U004c0050\U00430049\U00540041\U004f0049'
表示名为“APPLICATION”的表。
如果将每个32位字符视为两个16位字符,则会得到字符串“PALPCITAOI”。交换字符对(1和2,3和4等),它产生“APPLICATIO”(缺少“N”)。据推测,它交换了N和空字符,导致缺少N(假设以空字符结尾的字符串)。
如何正确获取表名?
这是在Python 2.4,PyODBC 2.1和MySQL 5.0.22下运行。
答案 0 :(得分:5)
将CHARSET = UTF8添加到连接字符串中,我现在已启动并运行该应用程序。例如:
变化
cnxn = pyodbc.connect('DSN=localhost')
到
cnxn = pyodbc.connect('DSN=localhost;CHARSET=UTF8')
感谢Thomas指出我正确的方向。升级到更高版本的PyODBC也可能有效。
答案 1 :(得分:2)
这是已在pyodbc 2.1.8中修复的已知问题:
https://code.google.com/p/pyodbc/issues/detail?id=78&can=1&q=UTF-16
不幸的是,对于Ubuntu LTS用户,Precise Pangolin的版本是2.1.7,这个问题仍然存在。如果你想坚持使用LTS我已经向后移植了pyodbc 3.0.6 - 你可以在这里找到它: