Найти - Пользователи
Полная версия: Кодировка для запросов в БД
Начало » Python для новичков » Кодировка для запросов в БД
1 2 3 4
KarDer_Groom
Доброго времени.
Скажу сразу что инфу по вопросу искал, читал форумы и спрашивал у специалистов, не помогло. (((
Вопрос: Есть база данный в кодировке 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, ‘борщ’

Спасибо за внимание.
o7412369815963
здесь функция tag() бесполезна, т.к. можно использовать так:
sql="DELETE FROM tabl WHERE name='%s'" % tags.pop()
а цикл у меня отработал нормально, без запроса к базе, возможно проблема с запросом…
KarDer_Groom
o7412369815963
Спасибо, сократило код, просто я новичёк и приёмов не знаю, сделал как сам понимал.
А запрос работает, только не принимает русские символы, а всё остальное удаляет бес проблем.
pioner
- Если записи в 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'). Попробуйте, мне то же пригодится :)
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)

Писал в запросе так:
where name='***' AND name='***'
Итог тот же символы и англ.слова косит, русские не трогает.
Lexander
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.
KarDer_Groom
Lexander
Я так понимаю что русский вы читаете.
В конфигурацию сервера я увы ничего не изменю, а может это и к лучшему.
А вот на счёт изменения характера соединения это интересно. И что там с атрибутом? Можно пример?
pioner
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 то же не делает и сообщение то же самое?
Lexander
Я даже иногда писать могу ,когда время есть :)
use_unicode и charset - это параметры соединения с БД (в документации описаны, между прочим), добавьте их в
db=connections.Connection(db='my_db',host='localhost',user='root',passwd='')

Плюс можно поиграться стандартным приемом, выполнив запрос вида “SET NAMES ‘UTF-8’” сразу после соединения с БД .
KarDer_Groom
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. Хотя это возможно в командной строке так отображалось.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB