2013-07-01 33 views
2

我有一個sql statemwent,其中包含一個Unicode特定的標誌。 unicode的標誌是波蘭文字Przesunięcie中的ę。請看下面的SQL INSERT語句:如何聲明一個Unicode字母的SQL INSERT語句

INSERT INTO res_bundle_props (res_bundle_id, value, name) 
VALUES(2, 'Przesunięcie przystanku', 'category.test'); 

我使用Postgres數據庫。我可以用unicode字母插入波蘭語單詞嗎?

+1

您用於此表的模板是什麼?它支持字符集嗎? –

+0

看看這個http://stackoverflow.com/questions/11429655/can-not-insert-german-characters-in-postgres – Rohan

+1

應該工作得很好。你確定語句參數是*正確接收*(無論你從哪裏得到)? –

回答

0

查找哪些服務器和客戶端編碼:

show server_encoding; 
server_encoding 
----------------- 
UTF8 

show client_encoding; 
client_encoding 
----------------- 
UTF8 

然後在客戶端設置爲相同的編碼服務器:

set client_encoding = 'UTF8'; 
SET 
+0

這太簡單了,而且往往是不正確的。考慮服務器使用utf-8的情況,但客戶端在'iso-8859-8'編碼終端中是'psql'。 'ש'在該終端中是一個完全合法的字符,編碼爲'0xf9'。如果你對Pg說謊,並說你真的在發送iso-8859-8時發送UTF-8,那麼Pg會嘗試將客戶端的'\ xf9'解碼爲utf-8,並失敗並報告錯誤的Unicode錯誤輸入。你很少需要直接更改'client_encoding';更多的時候你只需要確保它與你的輸入相匹配。 –

0

無需特別的語法要求,只要:

  • 您的server_encoding包含這些字符(如果它是utf-8它的話);
  • 您的client_encoding包含這些字符;
  • client_encoding正確的字節你實際發送

後者編碼方式相匹配的是,經常旅行的人了一個。他們認爲他們可以用SET client_encoding聲明更改client_encoding,它會做一些神奇的轉換。事實並非如此。 client_encoding告訴PostgreSQL「這是您將從客戶端收到的數據的編碼,以及客戶希望從您那裏獲得的編碼」。

設置client_encodingutf-8不會使客戶端實際發送UTF-8。這取決於客戶。你也不會發送utf-8;該字符串也可以用其他編碼中的iso-8859-2,iso-8859-4iso-8859-10表示。

最重要的是你告訴服務器你發送的數據的編碼。恰巧在所有提到的三種編碼中字符串都是相同的,ę編碼爲0xae ...但在utf-8中,這兩個字節是0xc4 0x99。如果你發送utf-8到服務器並告訴它它是iso-8859-2服務器不能說你錯了,並且將它解釋爲iso-8859-2中的Ä

所以......真的,這取決於東西,如系統的默認編碼,任何文件的編碼/流你從讀取數據,等你有兩個選擇:

  • 套裝client_encoding適合您正在使用的數據和系統的默認顯示區域設置。對於簡單的情況這是最簡單的,但在處理輸入或輸出中的多種不同編碼時更難。

  • 設置client_encoding爲UTF-8(或相同server_encoding),並確保你總是所有輸入數據轉換成在發送之前設置client_encoding的編碼。您還必須將您從Pg收到的所有數據轉換回來。