Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > mysqldb encoding


Автор: niro 16.12.2006, 15:42
Решил освавивать mysql(mysqldb). Изначально использую кодировку utf-8 . При попытке что либо отправить в данной кодировке. Вот пример
Код

#-*-coding:utf-8 -*-
import MySQLdb
con = MySQLdb.connect (host = "localhost",db = "test",charset='utf8')
cur = con.cursor()
cur.execute("SET NAMES 'utf8'")
print con.character_set_name()
cur.execute('create table base (val char(50)) charset=utf8;')
cur.execute("insert into base values(u'текст')")
cur.execute('select * from base')
result = cur.fetchall()
print result
cur.close()
con.commit()
con.close()

Из этого вылазит ошибка 
Код

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    cur.execute("insert into base values(u'я┌п╣п╨я│я┌')")
  File "/usr/local/lib/python2.5/site-packages/MySQLdb/cursors.py", line 146, in execute
    query = query.encode(charset)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 26: ordinal not in range(128)

Так же 
Код

print con.character_set_name() 

Выводит 
Код

latin1

Собственно ничего не помогает . Slackware 10.2 Mysql 4.1.14 Python 2.5

Автор: Daevaorn 16.12.2006, 15:53
Цитата(niro @  16.12.2006,  16:42 Найти цитируемый пост)
cur.execute("SET NAMES 'utf8'")

Попробуй убрать ковычки  у 'utf8'

Автор: niro 16.12.2006, 18:46
нет , не помогло , может быть все дело в конфигах

Автор: albertn 18.12.2006, 09:38
Попробуй так:
Код

cur.execute("insert into base values('текст')".decode('utf8'))

Автор: slav0nic 18.12.2006, 12:20
олько что в асе задали аналогичный вопрос, надо делать как уже указал albertn )

Автор: niro 19.12.2006, 15:00
Странно , но не работает , может кто реальный пример предложит , может я неправильно создаю базу  smile 

Автор: albertn 19.12.2006, 15:02
Цитата(niro @ 19.12.2006,  15:00)
Странно , но не работает , может кто реальный пример предложит , может я неправильно создаю базу  smile

А что пишет то?

Автор: niro 19.12.2006, 16:43
Код

#-*-coding:utf8 -*-
import MySQLdb
con = MySQLdb.connect (host = "localhost",user = "root",db = "test",charset='utf8',use_unicode=True)
cur = con.cursor()
cur.execute("SET NAMES 'utf8'")
print con.character_set_name()
#cur.execute("create table base (val char(50))")
cur.execute("insert into base values 'аыв'".decode('utf8'))
#cur.execute('select * from base')
#result = cur.fetchall()
#print result
cur.close()
con.commit()
con.close()

Error:
Код

latin1
Traceback (most recent call last):
  File "test.py", line 8, in <module>
    cur.execute("insert into base values 'п╟я▀п╡'".decode('utf8'))
  File "/usr/local/lib/python2.5/site-packages/MySQLdb/cursors.py", line 146, in execute
    query = query.encode(charset)
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 25-27: ordinal not in range(256)



Автор: pythonwin 20.12.2006, 08:15
niro, посмотри в http://forum.vingrad.ru/topic-119236.html  smile

Автор: niro 21.12.2006, 09:24
 smile 

Автор: niro 21.12.2006, 10:09
Разобрался , вся бага в том что метод передачи latin1 , вот что надо было дописать: 
Код

cur.execute(unicode("insert into base values('тест')",'latin1'))

Спасибо всем за участие ! 

Автор: albertn 21.12.2006, 10:14
Оригинально и, по-моему, совсем не верно, хоть и работает  smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)