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

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
bytea не работает с UTF8
    #34276072
autocommit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Удалось разобраться почему ошибка выскакивает когда появляются символы не латиницы ?
...
Рейтинг: 0 / 0
bytea не работает с UTF8
    #34276328
BlackDan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
autocommitУдалось разобраться почему ошибка выскакивает когда появляются символы не латиницы ?
Может быть вместо
Код: plaintext
query = 'insert into ' || tblName || '(pict) values(' || strFoto || ')';
надо было сделать
Код: plaintext
query = 'insert into ' || tblName || '(pict) values(decode(' || strFoto || ', \'escape\'))';

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

Сервер
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
bytea не работает с UTF8
    #34277160
autocommit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Действиельно работает значит. У меня проблема при передаче из клиента.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / bytea не работает с UTF8
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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