Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с отображением строк из MySQL, запрос к базе MySQL отображает ????????? 
V
    Опции темы
SergeiIv
Дата 6.10.2010, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 30.8.2010

Репутация: 1
Всего: 1



В базе MySQL в табл sotrudn одна запись и в поле famili значение "Ивачев".
В my.ini:

[mysql]
default-character-set=utf8

И схема, и таблица, и столбец имеют кодировку utf8

Вот простенькая прога в Pytone:

import MySQLdb

Код

db= MySQLdb.connect(host='localhost', user='newuser', passwd='sssss', db='new_schema')
cursor= db.cursor()
cursor.execute("select famili from sotrudn")
for i in cursor.fetchall():
    print repr(i)
db.close()

Вот результат:

('??????',)

Подставляю в my.ini

[mysqld]
skip-character-set-client-handshake

получаю:

('\xd0\x98\xd0\xb2\xd0\xb0\xd1\x87\xd0\xb5\xd0\xb2',)

Все "битвы" проиграл. Может кто поможет )?

Это сообщение отредактировал(а) Daevaorn - 6.10.2010, 12:35
PM MAIL   Вверх
pythonwin
Дата 6.10.2010, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: нет
Всего: 36



Цитата(SergeiIv @  6.10.2010,  15:19 Найти цитируемый пост)
Вот простенькая прога в Pytone:

 smile 
Код

# -*- coding: utf-8 -*-
db= MySQLdb.connect(host='localhost', user='newuser', passwd='sssss', db='new_schema')
cursor= db.cursor()
cursor.execute("select famili from sotrudn")
for i in cursor.fetchall():
    print repr(i.decode('cp866'))
db.close()


Думаю у вас стоит winXP и тогда наверное не нужно влазить в настройки mysql, а также при выводе на консоль необходимо учитывать, что там кодировка cp866
PM WWW GTalk Jabber   Вверх
SergeiIv
Дата 8.10.2010, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 30.8.2010

Репутация: 1
Всего: 1



Победил проблему так:
import MySQLdb
Код

#import _mysql

db= MySQLdb.connect(host='localhost', user='newuser', passwd='sptgw', db='new_schema')
cursor= db.cursor()
cursor.execute("select famili from sotrudn")
for i in cursor.fetchall():
     aa=eval(repr(i)[1:51])
     print i
     print aa

# хотя этот вариант работает:

a = '\xd0\x98\xd0\xb2\xd0\xb0\xd1\x87\xd0\xb5\xd0\xb2'
print(a.decode('utf-8'))
db.close()


результат:
Цитата

('\xd0\x98\xd0\xb2\xd0\xb0\xd1\x87\xd0\xb5\xd0\xb2',)
Ивачев
Ивачев


Конечно это искусственное решение проблемы, хотя сама проблема осталось и как решать её пока не знаю.
Хочу ещё заметить, что вся эта бодяга действительно по WinXP. 
PM MAIL   Вверх
SergeiIv
Дата 8.10.2010, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 30.8.2010

Репутация: 1
Всего: 1



Но вот ещё какая тут вариация получилась ))):

Код

import MySQLdb

db= MySQLdb.connect(host='localhost', user='newuser', passwd='sptgw', db='new_schema')
cursor= db.cursor()
cursor.execute("select famili, name from sotrudn")

for i in cursor.fetchall():
     print i
     print i[0]+' '+i[1]

db.close()


результат:
Цитата


('\xd0\x98\xd0\xb2\xd0\xb0\xd1\x87\xd0\xb5\xd0\xb2', '\xd0\xa1\xd0\xb5\xd1\x80\xd0\xb3\xd0\xb5\xd0\xb9')
Ивачев Сергей


Т.е. при печать кортежа print кодировка определяется не понятно, а при извлечении элемента кортежа всё нормально. Почему так, пока вопрос.
PM MAIL   Вверх
av0000
Дата 8.10.2010, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 11.2.2009

Репутация: 1
Всего: 2



Бли-и-ин!
Ну видно же, что возвращается, как и полагается, utf-8.

print для кортежей, списков итп "использует" repr, который не знает про кодировки и потому печатает байты.

Хочется строки -
Код

print u' '.join(i)
# или
print u'%s %s' % i

склеить через пробел, "заодно" можно конвертнуть в unicode. Вероятно первой-второй строке файла должно быть указание на кодировку самого .py файла -
Код

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

не помню в каких именно случаях автоконверт в unicode "падает" без явного указания кодировки.
Можно ещё сконвертить и после склейки -
Код

print unicode(' '.join(i), 'utf-8') # опять же лучше принудительно указать кодировку


PM MAIL Jabber   Вверх
SergeiIv
Дата 8.10.2010, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 30.8.2010

Репутация: 1
Всего: 1



Цитата(av0000 @  8.10.2010,  13:07 Найти цитируемый пост)
print для кортежей, списков итп "использует" repr, который не знает про кодировки и потому печатает байты.

 это всё объясняет. Спасибо av0000.
Кстати
print u' '.join(i)
# или
print u'%s %s' % i

выдает ошибку:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)
File "d:\PFiles\wxPython2.8 Docs and Demos\untitled-1.py", line 11, in <module>
  print u'%s %s' % i

а:
    print i[0]+' '+i[1]
    print unicode(' '.join(i), 'utf-8')
сработало правильно (и то и то)
но всё это только при наличии опции
skip-character-set-client-handshake
в My.ini
PM MAIL   Вверх
av0000
Дата 8.10.2010, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 11.2.2009

Репутация: 1
Всего: 2



Цитата(SergeiIv @  8.10.2010,  12:12 Найти цитируемый пост)
print u'%s %s' % i

выдает ошибку:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)


Вот этих нюансов я и не помню smile. Это последствия неправильной дефолтной кодовой страницы. Проявляется, в основном, под виндой.
Лечится указанием правильной кодировки консоли. Я знаю 2 способа. Второй подлиннее и нет под рукой примера, а первый - вот:
Код

# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

s = ('проверка', 'test')
print s
print u' '.join(s)
print u'%s %s' % s


Цитата(SergeiIv @  8.10.2010,  12:12 Найти цитируемый пост)
но всё это только при наличии опции
skip-character-set-client-handshake
в My.ini 

А вот тут уже надо "копать" настройки mysql-а. Т.е. если запретить мускулу перекодировку - он честно отдаёт utf-8. Я с ним дела не имею, но могу посоветовать поискать решение в мануалах по настройке django - где-то там такое попадалось.

Да, кстати, есть вероятность, что после указания sys.setdefaultencoding заработает и это... Что-то мне подсказывает, что он не может определить в какой кодировке отдавать данные и по-умолчанию их честно конвертит в вопросики.

PM MAIL Jabber   Вверх
SergeiIv
Дата 11.10.2010, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 30.8.2010

Репутация: 1
Всего: 1



av0000 спасибо.
Вышеуказанный пример работает, но только с выставленным skip-character-set-client-handshake
в My.ini.
PM MAIL   Вверх
22novimir
Дата 28.1.2013, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 27.1.2013
Где: Магнитогорск

Репутация: нет
Всего: нет



А у меня такой вот вопрос по базам. Залила на хостинг базу вроде раньше под ПХП работала супер и не кривлялась. А вот стала выборку писать на Питоне одни знаки вопроса. Что же случилось и где че прописать? В ПХП знаю, нужно прописать перед подключением к базе кое что по смене кодировки. А как в Питоне это реализовать? Спасибо!
PM MAIL WWW ICQ Skype   Вверх
lplsura
Дата 9.2.2013, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 8.2.2013
Где: Багуслав

Репутация: нет
Всего: нет



А интересно как вы базу из ПХП к Питону прикрутили:))) Вероятно у вас что то с кодировкой на сервере, напишите хостеру пусть сменит кодировку базы и все будет пучком. Некоторые хостеры разрешают это делать самому, а у некоторых нет. Можно и на лету менять кодировку, но это грузилово для сервера:)) Это для вас 22novimir!! smile 
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Базы данных | Следующая тема »


 




[ Время генерации скрипта: 0.1391 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.