LINUX.ORG.RU

Python 2.4, MySQL 5.0 и UTF-8


0

0

Проверьте, пожалуйста, следующий код:
===
#!/usr/bin/python -W ignore
import MySQLdb
cx = MySQLdb.connect(db='psydbtest',user='pacify',passwd='pacifypassword',use_unicod e=True,charset='utf8')
cx.set_character_set('utf8')
cur = cx.cursor()
cur.execute('drop table test')
cur.execute('create table test (id integer, name char(32))')
cur.execute('set names utf8')
cur.execute(u'insert into test (id,name) values (1,"Евклидовы пространства")')
cur.execute('set character set utf8')
cur.execute('select * from test')
print cur.fetchone()[1]
===
% ./test.py
Ð?вклидовÑ? пÑ?оÑ�Ñ?Ñ?Ð

Почему выдаются такие кракозябры?

★★★★★

Добавил еще одну запись через утилиту mysql ...
Стало лучше, но ненамного.
Проблема в MySQL ?
===
mysql> insert into test (id,name) values (2,'Евклидовы пространства');
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from test;
+------+----------------------------------+
| id   | name                             |
+------+----------------------------------+
|    1 | ▒?вклидов▒? п▒?ос▒?▒?▒ |
|    2 | Евклидовы простр▒ |
+------+----------------------------------+
2 rows in set (0.00 sec)

mysql>
===

pacify ★★★★★
() автор топика
Ответ на: комментарий от AngryElf

$ locale
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=

pacify ★★★★★
() автор топика

Проблему нашел.
Надо было прописать default-character-set=utf8 в секцию [mysqld] конфига MySQL.
Иначе было так:
mysql> \set
....
Server characterset: latin1
Db characterset: latin1
Client characterset: latin1
Conn. characterset: latin1

Сейчас, после пересоздания базы, так:
Server characterset: utf8
Db characterset: utf8
Client characterset: latin1
Conn. characterset: latin1

Правильная программа для локали utf8 (Debian 4.0 "Etch"):
===
#!/usr/bin/python -W ignore
import MySQLdb
cx = MySQLdb.connect(db='psydbtest',user='pacify',passwd='pacifypassword')
cur = cx.cursor()
try:
cur.execute('drop table test')
except: pass
cur.execute('create table test (id integer, name char(255))')
cur.execute(u'insert into test (id,name) values (1,"Евклидовы пространства")')
cur.execute('select * from test')
print cur.fetchone()[1]
===

$ ./test.py
Евклидовы пространства

pacify ★★★★★
() автор топика
Ответ на: комментарий от pacify

> Надо было прописать default-character-set=utf8 в секцию [mysqld] конфига MySQL.

Ктобы сомневался. Или создать базу в UTF8

Motiv_studenta ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.