Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Базы данных > kinterbasdb - Проблема с кодировкой


Автор: DmiSbr 20.10.2010, 11:00
Доброго всем дня !

Firebird 2.1.3 поднят на Ubuntu
Создана база с параметром "DEFAULT CHARACTER SET NONE"
В базе табличка
Код
CREATE TABLE USERS (
    USR_ID    INTEGER NOT NULL,
    USR_NAME  VARCHAR(50) CHARACTER SET WIN1251
);

Далее устанавливаем соединение и пишем в таблицу
Код
#!/usr/bin/python
# _*_ coding:cp1251
import os, sys

import kinterbasdb
from contextlib import closing

conn = kinterbasdb.connect(
 host='localhost', database='retail',
 user='sysdba', password='ghbynSh',
 charset='WIN1251', dialect=3)

curr = conn.cursor()

deleteSQL = "delete from users"
curr.execute(delete SQL)

insertSQL = "insert into users (usr_name) values('User')"
curr.execute(insertSQL)

insertSQL = "insert into users (usr_name) values('Юзер')"
curr.execute(insertSQL)
conn.commit()

curr.execute('select usr_name from users')
for record in curr:
 print record[0]

Запрос после вставки выбирает:
User
Юзер
То есть не в той кодировке
Если добавить строку в таблицу например из IBExpert, то все замечательно.
Подскажите пожалуйста, что я не учел и куда копать 
Заранее благодарен

Автор: pythonwin 20.10.2010, 11:11
Цитата(DmiSbr @  20.10.2010,  14:00 Найти цитируемый пост)
Firebird 2.1.3 поднят на Ubuntu

а зачем тогда cp1251? в будущем может понадобиться символы, которых нет в cp2151 и тогда лучше использовать кодировку utf-8
попробуй так
Код

insertSQL = "insert into users (usr_name) values('%s')"%(u'Юзер'.encode('cp1251')) # приведим к строке
curr.execute(insertSQL)
conn.commit()


и с начале файла кодировка выставлена странно - не видел так раньше - обычно так:
Код

# -*- coding: cp2151 -*-

Автор: DmiSbr 20.10.2010, 12:53
2 pythonwin

Да так работает
Спасибо большое

Буду дальше python ковырять, очень занимательная штука

Автор: pythonwin 20.10.2010, 13:00
DmiSbr, почитайте http://www.rupy.ru/static/files/07/02/12/rupyru2007-yurevich-unicode.pdf

Автор: DmiSbr 20.10.2010, 13:04
Цитата
а зачем тогда cp1251? в будущем может понадобиться символы, которых нет в cp2151 и тогда лучше использовать кодировку utf-8

Вопрос вдогонку:
Если база работает на Linux, клиенты планируются в Web с Windows и Linux, то какую кодовую страницу лучше использовать в базе и в программе ?

Автор: pythonwin 20.10.2010, 13:28
Цитата(DmiSbr @  20.10.2010,  16:04 Найти цитируемый пост)
Если база работает на Linux, клиенты планируются в Web с Windows и Linux, то какую кодовую страницу лучше использовать в базе и в программе ?

если сервер linux, а клиеты заходят на web-страницу, то лучше используйте кодировку utf-8, тем более, что у вас будет запас для работы с различными языками (немецкий, французский, китайский и т.д.)

Автор: DmiSbr 20.10.2010, 13:32
2 pythonwin
Цитата
если сервер linux, а клиеты заходят на web-страницу, то лучше используйте кодировку utf-8, тем более, что у вас будет запас для работы с различными языками (немецкий, французский, китайский и т.д.)

Понятно, спасибо. Будем пробовать на вкус UTF-8 

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