PyODBC выводит неправильный UTF-16 - PullRequest
8 голосов
/ 28 марта 2012

Я пытаюсь вытащить список имен таблиц из базы данных 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 (при условии, что строки заканчивались нулем).

Как правильно вывести имена таблиц?

Это работает под Python2.4, PyODBC 2.1 и MySQL 5.0.22.

Ответы [ 2 ]

5 голосов
/ 03 апреля 2012

Добавление CHARSET = UTF8 в строку подключения сработало, и теперь у меня есть приложение, работающее и работающее. Например:

изменение

cnxn = pyodbc.connect('DSN=localhost')

до

cnxn = pyodbc.connect('DSN=localhost;CHARSET=UTF8')

Спасибо, Томас, за то, что направили меня в правильном направлении. Обновление до более поздней версии PyODBC также может работать.

2 голосов
/ 04 мая 2013

Это известная проблема, которая была исправлена ​​в 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 - вы можете найти его здесь:

https://launchpad.net/~gazoakley/+archive/precise-backports

...