2011-10-11 52 views
1

我需要獲取特定於區域設置的最接近的字符,該值大於(在字符串比較中)給定的postgresql中的字符。我試圖用如何獲得大於postgresql中給定的最接近的字符?

SELECT chr(ascii(x)+1); 

但是當我測試了一下,沒有有時我希望的方式工作,爲

SELECT chr(ascii('я')+1); 

回報ѐ,但

SELECT 'я' < 'ѐ'; 

返回false 。

+2

是яASCII?我確信它不是。 – Corbin

+0

'ascii'函數必須根據規範 –

+1

「ASCII代碼中的第一個字符的ASCII碼返回非ASCII字符的數字,UTF8返回字符的Unicode代碼點,對於其他多字節編碼,參數必須成爲一個ASCII字符。「對於UTF8,這是事實。你的數據是UTF8嗎?如果是這樣,我應該先閱讀文檔:)。 (雖然可以說Postres應該在邏輯上命名它們的功能。) – Corbin

回答

1

文本的排序順序取決於lc_collate,而不是ASCII代碼或Unicode代碼點。 這些恰巧與大多數語言環境中的基本ASCII字符並行。其餘可能會有所不同。

你的輸出是show lc_collate

您期待的行爲僅適用於區域設置C。閱讀所有關於它in the fine manual

C和POSIX排序規則這兩者僅ASCII字母「A」到「Z」指定「傳統C」的行爲,在 被視爲字母, 和排序完成嚴格按字符代碼字節值

強調我的。 PostgreSQL 9.1擁有一些用於整理的新功能。

+0

lc_collat​​e ------------- en_US.UTF- 8 –

+0

@ Pupkov-Zadnij:你有答案,我不知道從頭頂上看,如何得到下一個特定於地區的字符,Docs可能會提供信息 –

+0

所以不可能只是得到下一個字符將會比給定的字符更大,如果它不在區域C中?o_O更新:赦免,沒有看到您的評論... –

0

在除C/POSIX以外的語言環境中,如果沒有詳盡的搜索,這通常是不可能的。你最好重新考慮你的要求。

如果您只是在實踐中處理有限的問題空間,例如俄語或拉丁字母,我建議您在應用程序的某處放置明確的信函列表。但是,如果你需要這個工作的任何Unicode字符或字符串,你會有一些問題。

相關問題