2010-11-26 73 views
0

我有編碼UTF-8,整理和ctype ru_RU.UTF-8的數據庫。表結構 - id,key,value。一號線插入:SQL選擇與Unicode

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); 
+0

爲什麼不顯示CREATE TABLE的DDL? – Unreason 2010-11-26 00:49:31

+0

CREATE TABLE翻譯 ( ID的序列NOT NULL, 「鑰匙」 字符改變(255)NOT NULL, 「價值」 的文字, 約束translations_pkey PRIMARY KEY(ID) )WITH( OIDS = FALSE ) ; ALTER TABLE翻譯OWNER TO用戶; CREATE UNIQUE INDEX index_translations_on_key ON translations USING btree (key); – 2010-11-26 00:51:35

+0

found函數quote_literal,它給出輸出 - E'---「\ xD0 \ xA0 \ xD0 \ xB0 \ xD0 \ xB7 \ xD0 \ xBC \ xD0 \ xB5 \ xD1 \ x80」',但不知道如何執行它。 – 2010-11-26 03:50:15

回答

2
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

我不明白,爲什麼你在數據庫中存儲溢出值,但據我所知,DECODE函數應該做你想。

 
SELECT decode(value, 'hex') 
FROM translations;