SQL выберите с помощью Unicode - PullRequest
0 голосов
/ 26 ноября 2010

У меня есть база данных с кодировкой UTF-8, collation и ctype ru_RU.UTF-8. Структура таблицы - id, key, value. Одна строка вставлена:

1 | size | --- "\xD0\xA0\xD0\xB0\xD0\xB7\xD0\xBC\xD0\xB5\xD1\x80"|

Когда я казнил

SELECT E'--- "\xD0\xA0\xD0\xB0\xD0\xB7\xD0\xBC\xD0\xB5\xD1\x80"';

в консоли, я получил правильный вывод

   ?column?   
   --------------
    --- "Размер"
   (1 row)

Но когда я попытался выполнить

select "value" from "translations" where "key"='size';

Я получил

   value                          
   --------------------------------------------------------
    --- "\xD0\xA0\xD0\xB0\xD0\xB7\xD0\xBC\xD0\xB5\xD1\x80"
   (1 row)

Как мне получить неэкранированную строку?

CREATE TABLE translations (
    id serial NOT NULL,
    "key" character varying(255) NOT NULL,
    "value" text,
    CONSTRAINT translations_pkey PRIMARY KEY (id) )
 WITH ( OIDS=FALSE );
 ALTER TABLE translations OWNER TO user;
 CREATE UNIQUE INDEX index_translations_on_key ON translations USING btree (key);

Ответы [ 2 ]

2 голосов
/ 26 ноября 2010
CREATE OR REPLACE FUNCTION eval(text) RETURNS text AS
$BODY$  
DECLARE
  s text;
  r text;
BEGIN
  s := 'select ' || $1 ;
  execute s into r;
  return r;
END;
$BODY$ LANGUAGE 'plpgsql' VOLATILE;

select eval(E'E\'' || "value" || E'\'') from translations where key = 'size' and "value" IS NOT NULL;

выглядит ужасно, но работает :)

0 голосов
/ 26 ноября 2010

Я не понимаю, почему вы храните экранированные значения в базе данных, но, насколько я могу судить, функция декодирования должна делать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...