2014-05-14 250 views
0

當我試圖從下面的代碼中的Unicode到Unicode轉換 「函數convert_from(字符變化,未知)不存在」錯誤發生。函數convert_from(字符變化,未知)不存在Postgres

select convert_from(artists, 'UTF8') from songs where  
to_tsvector('simple',convert_from(artists, 'UTF8')) 
    @@ plainto_tsquery('simple','alizee') 
limit 100 

列 「藝術家」 有 「TEXT」 類型。

但是當我跑步時

select convert_from(E'\u0422\u0438\u043c\u0430\u0442\u0438', 'UTF8'); 

它工作得很好。

我該如何解決這個問題? 我將不勝感激任何幫助。謝謝

+0

請在'artists'列中顯示值的示例。你不能在PostgreSQL的'text'字段中存儲「unicode」(假設你的意思是utf-16/utf-32/ucs-2/ucs-4),因爲它包含null字節,在'text'字段中終止字符串。所以無論如何,沒有足夠的信息來猜測。 **通過編輯問題顯示數據**,然後在完成後註釋。 –

+0

藝術家的樣本值列:「brig \ u0442 \ u0438ada」 – Mega4alik

+0

aah,所以它實際上是*文本*與unicode字符轉義。這是非常不同的。 –

回答

2

documentationconvert_from(string bytea, src_encoding name)。 投下藝術家BYTEA:

select convert_from(artists::bytea, 'UTF8') from songs where  
to_tsvector('simple',convert_from(artists, 'UTF8')) 
    @@ plainto_tsquery('simple','alizee') 
limit 100 
+2

從歌曲中選擇convert_from(artists :: bytea,'UTF8'),其中 to_tsvector( 'simple',convert_from(artists :: bytea,'UTF8')) @@ plainto_tsquery('simple','alizee') limit 100.發生另一個錯誤:「錯誤:類型爲bytea的無效輸入語法」 – Mega4alik

1

它看起來像你對我已經採取了數據在7位ASCII的形式用2字節Unicode十六進制轉義(\uxxxx),並將其存儲在一個varchar類型場。

convert_from完全是錯誤的方式來處理該數據。它不是utf-8,除了7位ASCII是utf-8的一個子集。如果你強迫它通過convert_from(..., 'utf-8')你會得到你開始什麼用,blah\u0123

select convert_from(E'\u0422\u0438\u043c\u0430\u0442\u0438', 'UTF8');出現工作的原因是convert_from什麼都不做。這裏是發生了什麼:

  • PostgreSQL的看到文字值E'\u0422\u0438\u043c\u0430\u0442\u0438'並看到convert_from希望bytea輸入。

  • PostgreSQL分析字符串文字的轉義字符串格式,解碼unicode轉義以產生utf-8字符串Тимати。在這一點上就好像你寫:

    SELECT convert_from('Тимати', 'utf-8') 
    
  • 因爲convert_from希望bytea輸入,PostgreSQL的隱式數據強制轉換爲bytea,轉換文本字符串爲UTF-8 encodied二進制,因爲這是你的數據庫服務器的文字編碼。現在,就好像你寫:

    SELECT convert_from(convert_to('Тимати','utf-8'), 'utf-8') 
    

    當第一轉換完成被變成:

    SELECT convert_from(BYTEA '\xd0a2d0b8d0bcd0b0d182d0b8', 'utf-8'); 
    

所以有效的convert_from就是什麼也不做在一個非常緩慢和低效的方式所有。

對於列值而不是文字,它不會以這種方式工作,因爲PostgreSQL將隱式地投射未知類型的文字,而不會隱式地投射已知類型的列值,例如varchar列。這是一個類型安全的事情。

因此,要正確地轉換您的數據,您需要解碼那些\u轉義。 convert_from不是你想要什麼,因爲它被設計爲將編碼文本的二進制表示轉換成本地數據庫文本編碼

PostgreSQL支持字符串文字,正如我們通過查看它爲E''文字所做的操作所確定的那樣。不過,我正在尋找一種能夠將解碼展現給用戶的功能。 decode(...)不支持\u轉義,只有八進制轉義...

相關問題