Форум сайта python.su
Доброго времени.
Скажу сразу что инфу по вопросу искал, читал форумы и спрашивал у специалистов, не помогло. (((
Вопрос: Есть база данный в кодировке 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
Офлайн
здесь функция tag() бесполезна, т.к. можно использовать так:
sql="DELETE FROM tabl WHERE name='%s'" % tags.pop()
Офлайн
o7412369815963
Спасибо, сократило код, просто я новичёк и приёмов не знаю, сделал как сам понимал.
А запрос работает, только не принимает русские символы, а всё остальное удаляет бес проблем.
Офлайн
- Если записи в 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)
Офлайн
Попробовал так:
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='***'
Итог тот же символы и англ.слова косит, русские не трогает.
Офлайн
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)
Офлайн
Lexander
Я так понимаю что русский вы читаете.
В конфигурацию сервера я увы ничего не изменю, а может это и к лучшему.
А вот на счёт изменения характера соединения это интересно. И что там с атрибутом? Можно пример?
Офлайн
KarDer_Groomэто к кодировке не относится, просто так эффективнее работать с базой.
where name='***' AND name='***'
KarDer_Groomа что конкретно в tagss было? какое слово?
Попробовал так:
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)
Офлайн
Я даже иногда писать могу ,когда время есть :)
use_unicode и charset - это параметры соединения с БД (в документации описаны, между прочим), добавьте их в
db=connections.Connection(db='my_db',host='localhost',user='root',passwd='')
Плюс можно поиграться стандартным приемом, выполнив запрос вида “SET NAMES ‘UTF-8’” сразу после соединения с БД .
Офлайн
pionerв этом случае: return tagss.decode('UTF-8') и в этом случае: tagss=unicode(tagss,'UTF-8')
а что конкретно в tagss было? какое слово?
не может закодировать в utf8 строку со страницы на utf8, но в уникод из utf8 то же не делает и сообщение то же самое?
Офлайн