Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / bytea не работает с UTF8 / 9 сообщений из 9, страница 1 из 1
23.08.2006, 10:32
    #33936590
Poligon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bytea не работает с UTF8
День добрый!
Возникла, такая проблема: есть таблица в ней два поля id bigserial- автоинкремент и pict bytea - картника. Записываю картинки в поле pict. Так вот проблема такая: когда кодировка базы win1251, то все замечательно работает. Если кодировка UTF8, то запись не происходит. А мне нужна именно UTF8. Подскажите пожалста в чем проблема.
...
Рейтинг: 0 / 0
23.08.2006, 10:36
    #33936603
pamir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bytea не работает с UTF8
Явно не в кодировке. У меня UTF-8 и все работает на ура.
Приводи код.
...
Рейтинг: 0 / 0
23.08.2006, 10:43
    #33936643
Poligon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bytea не работает с UTF8
Если так создаю, то все хорошо

create database pictureTest
with ENCODING = 'win1251'

Так не работает:

create database pictureTest
with ENCODING = 'UTF8'

Схема и таблица:

create schema img

create table img.pictureByte(
pictId bigserial primary key,
pict bytea
)

Запись через ф-ию, которая формирует запрос динамически. Скорее всего дело в ней:


CREATE OR REPLACE FUNCTION img.fn_imageAdd(tblName varchar,objId int8, image bytea) returns int4 as $$
declare
fnError constant varchar := 'Error: imageAdd('|| $1 || ',' || 'image' || ' )';
query varchar;
imageId int8;
strFoto varchar;
begin
begin
strFoto = quote_literal(encode(image,'escape'));
query = 'insert into ' || tblName || '(pict) values(' || strFoto || ')';
execute query;
imageId = currval(tblName || '_pictid_seq');
return imageId;
exception
when others then
end;
end;
$$ LANGUAGE 'plpgsql';
...
Рейтинг: 0 / 0
23.01.2007, 16:48
    #34276072
autocommit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bytea не работает с UTF8
Удалось разобраться почему ошибка выскакивает когда появляются символы не латиницы ?
...
Рейтинг: 0 / 0
23.01.2007, 18:07
    #34276328
BlackDan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bytea не работает с UTF8
autocommitУдалось разобраться почему ошибка выскакивает когда появляются символы не латиницы ?
Может быть вместо
Код: plaintext
query = 'insert into ' || tblName || '(pict) values(' || strFoto || ')';
надо было сделать
Код: plaintext
query = 'insert into ' || tblName || '(pict) values(decode(' || strFoto || ', \'escape\'))';

З.Ы.
Сам не проверял :)
...
Рейтинг: 0 / 0
23.01.2007, 18:36
    #34276415
autocommit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bytea не работает с UTF8
Нет так не получиться т.к. на этапе склеивания нельзя с помощью || клеить text с bytea.
Если используем
Код: plaintext
query = 'insert into ' || tblName || '(pict) values(''' || decode(strFoto, 'escape') || ''', ''escape'');';
то начинает работать. Но если вместо картинки попытаться засунуть скажем обычный текст с русскими буквами то вылетает ошибка.
...
Рейтинг: 0 / 0
23.01.2007, 19:32
    #34276595
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bytea не работает с UTF8
autocommitНет так не получиться т.к. на этапе склеивания нельзя с помощью || клеить text с bytea.
Если используем
Код: plaintext
query = 'insert into ' || tblName || '(pict) values(''' || decode(strFoto, 'escape') || ''', ''escape'');';
то начинает работать. Но если вместо картинки попытаться засунуть скажем обычный текст с русскими буквами то вылетает ошибка.
А текст ошибки и как именно засунуть?
...
Рейтинг: 0 / 0
23.01.2007, 19:36
    #34276602
BlackDan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bytea не работает с UTF8
Решил протестировать. Всё вроде бы работает :)

Сервер
PostgreSQL 8.1.5 on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) 4.1.1 20060525 (Red Hat 4.1.1-1)

Клиент
client_encoding = UNICODE


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
CREATE DATABASE bytea_test
  WITH OWNER = postgres
       ENCODING = 'UTF8'
       TABLESPACE = pg_default; --*/

CREATE TABLE images
(
  img bytea NOT NULL
) 
WITHOUT OIDS;--*/

CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql'
  HANDLER plpgsql_call_handler
  VALIDATOR plpgsql_validator;--*/

CREATE OR REPLACE FUNCTION insert_img(bytea) RETURNS varchar AS
$BODY$DECLARE
  _img ALIAS FOR $ 1 ;
  _query TEXT; 
BEGIN
  _query := 'INSERT INTO images VALUES(decode(' || quote_literal(encode(_img, 'escape')) || ', ''escape''))';
  EXECUTE _query;
  RAISE LOG '%', _query; -- Для отладки
  RETURN ''; 
END$BODY$
  LANGUAGE 'plpgsql'; --*/

select * from insert_img('zzz');

select * from insert_img('яяя');

select * from images;

З.Ы.
Подключился к базе с client_encoding = UTF8, хотя на машине стоит кодировка KOI8,
получил след. ошибку.
авторERROR: invalid byte sequence for encoding "UTF8": 0xd1d1
HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
сделал
set client_encoding = KOI8R;
и всё запахало
...
Рейтинг: 0 / 0
24.01.2007, 08:56
    #34277160
autocommit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bytea не работает с UTF8
Действиельно работает значит. У меня проблема при передаче из клиента.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / bytea не работает с UTF8 / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]