Форум сайта python.su
webchemistИспользуй поле Unicode или перекодируй сам.
Т.е. вывод - оба ORM-a неправильно осуществляют перекодировку. Вопрос - что делать? Настройки какие только не ставил…
#!/usr/bin/python # -*- coding: utf-8 -*- from sqlalchemy import * db = create_engine('mysql://root@localhost/py') metadata = MetaData(db) test = Table('test', metadata, Column('username', String(40))) metadata.create_all() test.insert().execute(username=u'тект на русском'.encode('utf-8')) for u in test.select().execute(): print u[0]
bash-3.2$ ./test.py
тект на русском
bash-3.2$ ./test.py
тект на русском
тект на русском
bash-3.2$
Офлайн
slivlen
Проблема не в том, чтобы вставить юникодовую строку так, чтобы в базе получился UTF-8. Проблема в том, что я не могу из базы прочитать данные, которые там хранятся в UTF-8. Возвращаются вопросики или тарабарщина…
Ваш пример в базу записал строки вида “Ñ‚ÐµÐºÑ‚ на Ñ?уÑ�Ñ�ком”, которые так и выводятся. Если заменить Column('username', String(40))) на Column('username', Unicode(40))) - начинают выводится как “тект на русском”
Если сделать после подключения db.execute('SET NAMES UTF8') - строки вставляются и выводятся в UTF-8.
Если вместо name=u'ткcт на русском'.encode('UTF-8') сделать просто name=u'ткcт на русском' ситуация не меняется
Блин, уже почти два дня убил…
Попробывал Storm - походу интересный ORM. Но и здесь проблема есть, правда иного рода: по умолчанию опять же имею вопросики в выводе. Если же после подключения делаю запрос на базу вида “SET NAMES UTF8”, возвращает строки вида “Ð¼Ð°Ð¼Ð°”.
Отредактировано (Авг. 16, 2007 16:35:33)
Офлайн
webchemistТак в моем примере данные не только вносятся в базу, но и извлекаются из нее. И как видишь проблем с выводом у меня не наблюдается.
Проблема в том, что я не могу из базы прочитать данные, которые там хранятся в UTF-8.
bash-3.2# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 32
Server version: 5.0.37 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> use py
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from test;
+------------------------------+
| username |
+------------------------------+
| тект на русском |
| тект на русском |
+------------------------------+
2 rows in set (0.00 sec)
mysql>
Офлайн
А какое значение имеет системная (это в смысле ОС или что?) кодировка? Ведь везде кодирвка указывается явно. Тестировал походу в Python Shell, там вроде UTF-8
Кстати, как при использовании SAContext и SQLAlchemy выволнить прямой запрос на базу?
Отредактировано (Авг. 16, 2007 18:05:52)
Офлайн
webchemistСистемная кодировка - это кодировка в твоей ОС. То, что везде указана кодировка еще не означает, что все в нее автоматически перекодируется(Для примера открой файл с русским текстом созданный блокнотом в винде и попробуй вывести его содержимое в питоновском шелле) :) Кодировка питоновского шелла такая же как и системная.
А какое значение имеет системная (это в смысле ОС или что?) кодировка? Ведь везде кодирвка указывается явно. Тестировал походу в Python Shell, там вроде UTF-8
Офлайн
slivlen
У шелла видимо ansi. Впрочем все-равно не понимаю, как может системная кодировка здесь как-то повлиять. Ведь киррилические строки не просто *отображаются* неверно, они бьются - т.е. на некой стадии происходит неверное преобразование “юникод-некая кодировка”. Т.е. где-то они интерпретируются не как UTF-8, а как ansi (вероятно), соответственно вся кириллица перекодируется х.з. как. Почему так происходит и кто виноват - не постигаю. В первый раз сталкиваюсь с таким поведением - впрочем, и юникод раньше не использовал в проектах.
То же кстати интересный момент: как я уже говорил, при вставке строк name=u'ткcт на русском'.encode('UTF-8') или name=u'ткcт на русском' в базе сохранятеся одно и то же.
Кстати, Storm даже при прямом установлении кодировки не удалось заставить работать правильно. А жаль, понравился.
В общем остановился пока на варианте с чистой SQLAlchemy с явным вызовом SET NAMES - проект то надо делать… Пришлось выкинуть SAContext и настройку через Pylons config. Но проблема, увы, не решена…
Офлайн
Всем спасибо! Пока что решил так - в DSN прописал ?charset=UTF8. Работает.
Офлайн
У меня такая-же проблема.
Добавил
webchemistно только при выводе текста, при его добавлении все равно ругается, что не правильная кодировка!
в DSN прописал ?charset=UTF8. Работает.
Офлайн
kchА как строки попадают в базу? В коде (типа тест), шелл или через некую форму?
Хотя все это в Gentoo работало, а в Ubuntu такая беда.
Офлайн