Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 17, 2009 10:21:52

KarDer_Groom
От:
Зарегистрирован: 2009-11-17
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодировка для запросов в БД

Доброго времени.
Скажу сразу что инфу по вопросу искал, читал форумы и спрашивал у специалистов, не помогло. (((
Вопрос: Есть база данный в кодировке utf-8. В неё таблицы содержащие русские слова, английские, цифры (в общем всё). Я формирую список из слов, словосочетаний, далее запросом сравниваю поочерёдно элементы из списка с данными БД и если они совпадают, то удаляю строку. Проблема в том что строки состоящие из цифр, символов, англ.букв, удаляются нормально, но если встречается русский символ, то эта запись не удаляется, в итоге остаются только те строки где были русские символы.

Так как новечёк, пишу как показали или вычитал, код в файле .py, БД - MySQL работаю через MySQL Query Browser, выполняю через cmd.
——Вот некоторые подробности, чтоб их не повторять——
Этим я проверил что БД в кодировке utf-8:
show variables like ‘coll%’;
show variables like ‘char%’;

В начале я указал: # -*- coding: utf-8 -*-

Так я пробовал: u'слово русское' - не помогло

И наконец сам код:

# -*- coding: utf-8 -*-
import sys
from MySQLdb import connections
db=connections.Connection(db='my_db',host='localhost',user='root',passwd='')
c=db.cursor()

tags=["air art моментальный загар", "B-КОМПЛЕКС", "2008", "home", "борщ", "###@@@", "2"]

def tag():
tagss=tags[-1]
tags.pop()
return tagss

for num in range(len(tags)):
sql="DELETE FROM tabl WHERE name='%s'" % tag()
c.execute(sql)
db.commit()
for i, n in c.fetchall():
print i, n
В итоге этого кода командная строка показывает:
C:\…путь…\MySQLdb\__init__.py:34: DeprecationWarning: the sets module is deprecated from sets import ImmutableSet - так понял это не критично.

В таблице остались строки:
3618, ‘air art моментальный загар’
1137, ‘B-КОМПЛЕКС’
2337, ‘борщ’

Спасибо за внимание.



Офлайн

#2 Ноя. 17, 2009 11:35:02

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Кодировка для запросов в БД

здесь функция tag() бесполезна, т.к. можно использовать так:

sql="DELETE FROM tabl WHERE name='%s'" % tags.pop()
а цикл у меня отработал нормально, без запроса к базе, возможно проблема с запросом…

Офлайн

#3 Ноя. 17, 2009 12:10:55

KarDer_Groom
От:
Зарегистрирован: 2009-11-17
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодировка для запросов в БД

o7412369815963
Спасибо, сократило код, просто я новичёк и приёмов не знаю, сделал как сам понимал.
А запрос работает, только не принимает русские символы, а всё остальное удаляет бес проблем.



Офлайн

#4 Ноя. 17, 2009 12:28:11

pioner
От:
Зарегистрирован: 2009-10-21
Сообщения: 146
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодировка для запросов в БД

- Если записи в utf-8, то return tagss.decode('UTF-8'),
т.е. str.decode([encoding]).

- Лучше в запрсе писать так: where name='***' AND name='***' и т.д. но “разумной длины”. на длину запроса есть ораничения.

# -*- coding: utf-8 -*- указывает питону в какой кодировке скрипт написан, и по идее русские буквы то же должны быть в этой же кодировке (так оно и есть). Я пробовал на питоне sqlite, она требует делать записи в уникоде. А так как в питоне работа с базой стандартизирована через API2, то скорре всего и запрос к mysql в уникоде надо делать. Т.е. tagss=unicode(tagss,'UTF-8'). Попробуйте, мне то же пригодится :)



Отредактировано (Ноя. 17, 2009 12:55:04)

Офлайн

#5 Ноя. 17, 2009 13:02:58

KarDer_Groom
От:
Зарегистрирован: 2009-11-17
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодировка для запросов в БД

Попробовал так:
return tagss.decode('UTF-8')
и
tagss=unicode(tagss,'UTF-8')
return tagss
- выдало ошибку и там и там, не может декодировать, недействительные данные. (UnicodeDecodeError: ‘utf8’ codec can't decode bytes in position 2-3: invalid data)

Писал в запросе так:
where name='***' AND name='***'
Итог тот же символы и англ.слова косит, русские не трогает.



Офлайн

#6 Ноя. 17, 2009 14:25:53

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Кодировка для запросов в БД

use_unicode

If True, CHAR and VARCHAR and TEXT columns are returned as Unicode strings, using the configured character set. It is best to set the default encoding in the server configuration, or client configuration (read with read_default_file). If you change the character set after connecting (MySQL-4.1 and later), you'll need to put the correct character set name in connection.charset.

If False, text-like columns are returned as normal strings, but you can always write Unicode strings.

This must be a keyword parameter.

charset
The character set used by the connection. In MySQL-4.1 and newer, it is possible (but not recommended) to change the connection's character set with an SQL statement. If you do this, you'll also need to change this attribute. Otherwise, you'll get encoding errors.



Отредактировано (Ноя. 17, 2009 14:26:52)

Офлайн

#7 Ноя. 17, 2009 15:13:36

KarDer_Groom
От:
Зарегистрирован: 2009-11-17
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодировка для запросов в БД

Lexander
Я так понимаю что русский вы читаете.
В конфигурацию сервера я увы ничего не изменю, а может это и к лучшему.
А вот на счёт изменения характера соединения это интересно. И что там с атрибутом? Можно пример?



Офлайн

#8 Ноя. 17, 2009 15:47:31

pioner
От:
Зарегистрирован: 2009-10-21
Сообщения: 146
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодировка для запросов в БД

KarDer_Groom
where name='***' AND name='***'
это к кодировке не относится, просто так эффективнее работать с базой.

KarDer_Groom
Попробовал так:
return tagss.decode('UTF-8')
и
tagss=unicode(tagss,'UTF-8')
return tagss
- выдало ошибку и там и там, не может декодировать, недействительные данные. (UnicodeDecodeError: ‘utf8’ codec can't decode bytes in position 2-3: invalid data)
а что конкретно в tagss было? какое слово?
не может закодировать в utf8 строку со страницы на utf8, но в уникод из utf8 то же не делает и сообщение то же самое?



Офлайн

#9 Ноя. 17, 2009 16:00:19

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Кодировка для запросов в БД

Я даже иногда писать могу ,когда время есть :)
use_unicode и charset - это параметры соединения с БД (в документации описаны, между прочим), добавьте их в
db=connections.Connection(db='my_db',host='localhost',user='root',passwd='')

Плюс можно поиграться стандартным приемом, выполнив запрос вида “SET NAMES ‘UTF-8’” сразу после соединения с БД .



Офлайн

#10 Ноя. 17, 2009 16:28:40

KarDer_Groom
От:
Зарегистрирован: 2009-11-17
Сообщения: 59
Репутация: +  0  -
Профиль   Отправить e-mail  

Кодировка для запросов в БД

pioner
а что конкретно в tagss было? какое слово?
не может закодировать в utf8 строку со страницы на utf8, но в уникод из utf8 то же не делает и сообщение то же самое?
в этом случае: return tagss.decode('UTF-8') и в этом случае: tagss=unicode(tagss,'UTF-8')
Всё ведёт себя абсолютно одинаково.

Когда tagss==home -> возвращается ‘home’ (просматриваю print tagss -> home)
когда tagss==B-КОМПЛЕКС -> возвращается None (просматриваю print tagss -> ╧Ёштх╥╥╥)

в tagss попадало русское слово, одно и тоже, просмотрел пошагово, после этого ошибка вылетает.

Кстати просмотрел что во время выполнения лежит в cписке (tags), вывел его и там среди нормальных англ слов, русские слова заменялись этим \xcf\xf0\xe8\xe2\xe5\xd2\xd2\xd2. Хотя это возможно в командной строке так отображалось.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version