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


Автор: optix 15.10.2007, 14:36
Код

CREATE DATABASE 'c:\somedb.fdb' 
user 'SYSDBA' password '123';

По дефолту CHARACTER SET NONE, все работает нормально.

Код

    insertSql = """insert into 
            SOMETABLE (PARAM1, PARAM2, PARAM3, PARAM4) 
            values (?, ?, ?, ?)"""

.....
.....
.....

        row = [ param1.encode("cp1251"),
               param2.encode("cp1251"), 
               param3.encode("cp1251"), 
               param4.encode("cp1251") ]   
        self.cursor.execute(self.insertSql, row)
        self.connection.commit()


param1... param4 - строки в utf8


Если указываю кодировку WIN1251 - не работет.

Код

CREATE DATABASE 'c:\somedb.fdb' 
user 'SYSDBA' password '123' 
DEFAULT CHARACTER SET WIN1251;



Цитата

(-802, 'isc_dsql_execute: \n  arithmetic exception, numeric overflow, or string truncation\n  Cannot transliterate character between character sets')

Автор: pythonwin 15.10.2007, 16:38
Цитата(optix @  15.10.2007,  17:36 Найти цитируемый пост)
Если указываю кодировку WIN1251 - не работет.

а если прописать cp1251 ?

Автор: optix 16.10.2007, 08:42
Цитата(pythonwin @ 15.10.2007,  16:38)
Цитата(optix @  15.10.2007,  17:36 Найти цитируемый пост)
Если указываю кодировку WIN1251 - не работет.

а если прописать cp1251 ?

Цитата

Statement failed, SQLCODE = -204

Dynamic SQL Error
-SQL error code = -204
-Data type unknown
-CHARACTER SET CP1251 is not defined

Автор: optix 16.10.2007, 09:06
Все, решил проблему
надо при коннекте указывать кодировку оказывается.

Автор: pythonwin 17.10.2007, 06:14
optix, сможешь написать пример или дать ссылки? 
для будущих поколений smile

Автор: optix 17.10.2007, 09:54
Цитата(pythonwin @ 17.10.2007,  06:14)
optix, сможешь написать пример или дать ссылки? 
для будущих поколений smile

Пожалуйста
указываем кодировку при соединении
Код

import kinterbasdb as dbdriver
.....

        self.connection = dbdriver.connect( 
                            dsn='c:\mydb.fdb', 
                            user='sysdba', 
                            password='123',
                            dialect=3,
                            charset='WIN1251'  )


и сцылка 
http://kinterbasdb.sourceforge.net/dist_docs/usage.html#tutorial_connect




Вот тока теперь у меня еще одна трабла возникла.

Вот это все отлично работало под виндой. Пытаюсь перенести под линух
пишет 

Цитата

'ascii' codec can't decode byte 0xc0 in position 8: ordinal not in range(128)


то что пишеться в базу выглядит во так вот
Цитата

['1174628860.77', 'default.\xc0\xeb\xe5\xf0\xf2\xca\xee\xeb\xeb\xe5\xea\xf2\xee\xf0\xd2\xe5\xf1\xf2\xe5\xf0', '\xf2\xe5\xf1\xf2\xee\xe2\xfb\xe9_\xea\xe0\xf3\xed\xf2\xe5\xf0', '352']

вроде похоже на win1251





Автор: setq 17.10.2007, 11:01
Вот это место очень подозрительно:

Код

    param1.encode("cp1251")


Особенно если " param1... param4 - строки в utf8 ". Я бы предварительно декодировал строку в юникод, но я не профи. Ну то есть:

Код

    # Я точно знаю что мои строки в utf8 и я прочёл всё что нашёл
    # в Гугл про работу с юникодом в Питоне. Ха ха ха! Чтож, посмотрим
    # сработает или нет...
    param1.decode("utf8").encode("cp1251")

Автор: optix 17.10.2007, 11:11
Короче трабла решилась так

Код

import sys
reload(sys)
sys.setdefaultencoding("cp1251")



Тока непонятно зачем нужен reload(sys)
Если без этой строчик то ругается мол нету такой штуки как 'setdefaultencoding'

Цитата

>>> import sys
>>> sys.setdefaultencoding("cp1251")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'setdefaultencoding'
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding("cp1251")
>>>

Автор: pythonwin 17.10.2007, 12:20
Цитата(optix @  17.10.2007,  14:11 Найти цитируемый пост)
Короче трабла решилась так

можно ещё прописать кодировку в стандартном файле site.py, но как и способ, который ты используешь не позволяет более одного приложения использовать разные кодировки по умолчанию
короче - читай о unicode у j2a

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