<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 22.3\. 字符集支持 PostgreSQL中的字符集支持可以讓你以各種字符集存儲文本(也稱為編碼), 包含單字節字符集,比如ISO-8859系列和多字節字符集比如EUC(擴展Unix編碼)、 UTF-8、Mule國際編碼。 所有字符集都可以被客戶端透明地使用。 但是有一些不支持在服務器上使用(即作為服務器端編碼)。 缺省的字符集是在使用`initdb`初始化數據庫集群的時候選擇的。 在你創建數據庫的時候是可以覆蓋這個缺省值的。因此,你可以有多個數據庫, 每個都有不同的字符集。 但是,有一個重要的限制,每個數據庫的字符集必須與該數據庫的`LC_CTYPE`(字符類別)以及 `LC_COLLATE`(字符串排序順序)區域設置相兼容。對于`C`或者 `POSIX`區域,允許任何字符集, 但對于其他區域只有一個字符集設置能正常工作。(不過在Windows上,UTF-8編碼可用于任何區域)。 ## 22.3.1\. 支持的字符集 [Table 22-1](#calibre_link-1614)顯示了可以在PostgreSQL中使用的 字符集。 **Table 22-1\. PostgreSQL字符集** | 名字 | 描述 | 語言 | 服務端? | 字節數/字符 | 別名 | | --- | --- | --- | --- | --- | --- | | `BIG5` | 大五碼 | 繁體中文 | No | 1-2 | `WIN950`, `Windows950` | | `EUC_CN` | 擴展UNIX代碼-CN | 簡體中文 | Yes | 1-3 | | `EUC_JP` | 擴展UNIX代碼-JP | 日文 | Yes | 1-3 | | `EUC_JIS_2004` | 擴展UNIX代碼-JP, JIS X 0213 | 日文 | Yes | 1-3 | | `EUC_KR` | 擴展UNIX代碼-KR | 韓文 | Yes | 1-3 | | `EUC_TW` | 擴展UNIX代碼-TW | 繁體中文,臺灣 | Yes | 1-3 | | `GB18030` | 國標碼 | 中文 | No | 1-2 | | `GBK` | 擴展國標碼 | 簡體中文 | No | 1-2 | `WIN936`, `Windows936` | | `ISO_8859_5` | ISO 8859-5, ECMA 113 | 拉丁/西里爾語 | Yes | 1 | | `ISO_8859_6` | ISO 8859-6, ECMA 114 | 拉丁/阿拉伯語 | Yes | 1 | | `ISO_8859_7` | ISO 8859-7, ECMA 118 | 拉丁/希臘語 | Yes | 1 | | `ISO_8859_8` | ISO 8859-8, ECMA 121 | 拉丁/希伯萊語 | Yes | 1 | | `JOHAB` | JOHAB | 韓語 | No | 1-3 | | `KOI8R` | KOI8-R | 西里爾語(俄國) | Yes | 1 | `KOI8` | | `KOI8U` | KOI8-U | 西里爾語(烏克蘭) | Yes | 1 | | `LATIN1` | ISO 8859-1, ECMA 94 | 西歐語 | Yes | 1 | `ISO88591` | | `LATIN2` | ISO 8859-2, ECMA 94 | 中歐語 | Yes | 1 | `ISO88592` | | `LATIN3` | ISO 8859-3, ECMA 94 | 南歐語 | Yes | 1 | `ISO88593` | | `LATIN4` | ISO 8859-4, ECMA 94 | 北歐語 | Yes | 1 | `ISO88594` | | `LATIN5` | ISO 8859-9, ECMA 128 | 土耳其語 | Yes | 1 | `ISO88599` | | `LATIN6` | ISO 8859-10, ECMA 144 | 日耳曼語 | Yes | 1 | `ISO885910` | | `LATIN7` | ISO 8859-13 | 波羅的海語 | Yes | 1 | `ISO885913` | | `LATIN8` | ISO 8859-14 | 凱爾特語 | Yes | 1 | `ISO885914` | | `LATIN9` | ISO 8859-15 | 帶有歐洲語系和語調的LATIN1 | Yes | 1 | `ISO885915` | | `LATIN10` | ISO 8859-16, ASRO SR 14111 | 羅馬尼亞語 | Yes | 1 | `ISO885916` | | `MULE_INTERNAL` | Mule internal code | 多語種Emacs | Yes | 1-4 | | `SJIS` | Shift JIS | 日語 | No | 1-2 | `Mskanji`, `ShiftJIS`, `WIN932`, `Windows932` | | `SHIFT_JIS_2004` | Shift JIS, JIS X 0213 | 日語 | No | 1-2 | | `SQL_ASCII` | unspecified (see text) | _任意_ | Yes | 1 | | `UHC` | Unified Hangul Code | 韓語 | No | 1-2 | `WIN949`, `Windows949` | | `UTF8` | Unicode, 8-bit | _全部_ | Yes | 1-4 | `Unicode` | | `WIN866` | Windows CP866 | 西里爾語 | Yes | 1 | `ALT` | | `WIN874` | Windows CP874 | 泰國語 | Yes | 1 | | `WIN1250` | Windows CP1250 | 中歐語 | Yes | 1 | | `WIN1251` | Windows CP1251 | 西里爾語 | Yes | 1 | `WIN` | | `WIN1252` | Windows CP1252 | 西歐語 | Yes | 1 | | `WIN1253` | Windows CP1253 | 希臘語 | Yes | 1 | | `WIN1254` | Windows CP1254 | 土耳其語 | Yes | 1 | | `WIN1255` | Windows CP1255 | 希伯來語 | Yes | 1 | | `WIN1256` | Windows CP1256 | 阿拉伯語 | Yes | 1 | | `WIN1257` | Windows CP1257 | 波羅的語 | Yes | 1 | | `WIN1258` | Windows CP1258 | 越南語 | Yes | 1 | `ABC`, `TCVN`, `TCVN5712`, `VSCII` | 并非所有API都支持上面列出的編碼。比如, PostgreSQL JDBC驅動就不支持`MULE_INTERNAL`, `LATIN6`, `LATIN8`和`LATIN10`。 `SQL_ASCII`設置與其它設置表現得相當不同。如果服務器字符集是`SQL_ASCII`, 服務器根據ASCII標準解析0-127的字節值,而字節值為128-255的則當作未解析的字符。 如果設置為`SQL_ASCII`就不會有編碼轉換。因此,這個設置基本不用來聲明所使用的編碼, 因為這個聲明會忽略編碼。在大多數情況下,如果你使用了任何非ASCII數據, 那么使用`SQL_ASCII`設置都是不明智的,因為PostgreSQL 會無法幫助你轉換或者校驗非ASCII字符。 ## 22.3.2\. 設置字符集 `initdb`為一個PostgreSQL 集群定義缺省的字符集(編碼),比如: ``` initdb -E EUC_JP ``` 把缺省字符集設置為`EUC_JP`(用于日文的擴展Unix編碼)。 如果你喜歡用長選項聲明的話,可以用`--encoding`代替`-E`選項。 如果沒有給出`-E`或者`--encoding`選項, `initdb`將基于指定的或者缺省的區域試圖判斷合適的編碼。 你可以在數據庫創建時指定非缺省編碼,但是指定的編碼必須與所選的區域相兼容: ``` createdb -E EUC_KR -T template0 --lc-collate=ko_KR.euckr --lc-ctype=ko_KR.euckr korean ``` 將創建一個使用`EUC_KR`字符集以及`ko_KR`區域的 名字叫`korean`的數據庫。另外一種實現方法是使用SQL命令: ``` CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE='ko_KR.euckr' TEMPLATE=template0; ``` 注意上述命令聲明拷貝`template0`數據庫。當拷貝任何其他數據庫時, 來自源數據庫的編碼和區域設置不能被改變,因為可能導致數據損壞。參閱[Section 21.3](#calibre_link-1266) 獲取更多信息。 數據庫的編碼是存儲在`pg_database`系統表中的。 你可以用`psql`的`-l`選項或`\l` 命令列出這些編碼。 ``` $ <kbd class="literal">psql -l</kbd> List of databases Name | Owner | Encoding | Collation | Ctype | Access Privileges -----------+----------+-----------+-------------+-------------+------------------------------------- clocaledb | hlinnaka | SQL_ASCII | C | C | englishdb | hlinnaka | UTF8 | en_GB.UTF8 | en_GB.UTF8 | japanese | hlinnaka | UTF8 | ja_JP.UTF8 | ja_JP.UTF8 | korean | hlinnaka | EUC_KR | ko_KR.euckr | ko_KR.euckr | postgres | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 | template0 | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 | {=c/hlinnaka,hlinnaka=CTc/hlinnaka} template1 | hlinnaka | UTF8 | fi_FI.UTF8 | fi_FI.UTF8 | {=c/hlinnaka,hlinnaka=CTc/hlinnaka} (7 rows) ``` > **Important:** 在大多數現代操作系統中,PostgreSQL可以通過 `LC_CTYPE`的設置決定使用哪種字符集,并且強制只使用匹配的數據庫編碼。在舊的操作系統上 你有責任確保使用所選區域所期望的編碼。 如果這上面犯錯誤很可能導致與區域相關的操作表現出古怪的行為,比如排序。 > > 即使當`LC_CTYPE`不是`C`或者`POSIX`時, PostgreSQL也允許超級用戶創建 使用`SQL_ASCII`編碼的數據庫。正如 以上所述,`SQL_ASCII`不強制存儲在數據庫中的數據 具有任何特定的編碼,所以這個選擇帶來 區域相關的不當行為的風險。使用這樣的設置組合是不推薦的,也許有一天會被完全禁止。 ## 22.3.3\. 服務器和客戶端之間的自動字符集轉換 PostgreSQL支持在服務器和前端之間的自動編碼轉換。 轉換信息在系統表`pg_conversion`中存儲。 PostgreSQL帶著一些預定義的轉換。 它們在[Table 22-2](#calibre_link-1615)中列出。 你可以使用SQL命令`CREATE CONVERSION`創建一個新的轉換。 **Table 22-2\. 客戶/服務器字符集轉換** | 服務器字符集 | 可用客戶端字符集 | | --- | --- | | `BIG5` | _不支持做服務器端編碼_ | | `EUC_CN` | _EUC_CN_, `MULE_INTERNAL`, `UTF8` | | `EUC_JP` | _EUC_JP_, `MULE_INTERNAL`, `SJIS`, `UTF8` | | `EUC_KR` | _EUC_KR_, `MULE_INTERNAL`, `UTF8` | | `EUC_TW` | _EUC_TW_, `BIG5`, `MULE_INTERNAL`, `UTF8` | | `GB18030` | _不支持做服務器端編碼_ | | `GBK` | _不支持做服務器端編碼_ | | `ISO_8859_5` | _ISO_8859_5_, `KOI8R`, `MULE_INTERNAL`, `UTF8`, `WIN866`, `WIN1251` | | `ISO_8859_6` | _ISO_8859_6_, `UTF8` | | `ISO_8859_7` | _ISO_8859_7_, `UTF8` | | `ISO_8859_8` | _ISO_8859_8_, `UTF8` | | `JOHAB` | _JOHAB_, `UTF8` | | `KOI8R` | _KOI8R_, `ISO_8859_5`, `MULE_INTERNAL`, `UTF8`, `WIN866`, `WIN1251` | | `KOI8U` | _KOI8U_, `UTF8` | | `LATIN1` | _LATIN1_, `MULE_INTERNAL`, `UTF8` | | `LATIN2` | _LATIN2_, `MULE_INTERNAL`, `UTF8`, `WIN1250` | | `LATIN3` | _LATIN3_, `MULE_INTERNAL`, `UTF8` | | `LATIN4` | _LATIN4_, `MULE_INTERNAL`, `UTF8` | | `LATIN5` | _LATIN5_, `UTF8` | | `LATIN6` | _LATIN6_, `UTF8` | | `LATIN7` | _LATIN7_, `UTF8` | | `LATIN8` | _LATIN8_, `UTF8` | | `LATIN9` | _LATIN9_, `UTF8` | | `LATIN10` | _LATIN10_, `UTF8` | | `MULE_INTERNAL` | _MULE_INTERNAL_, `BIG5`, `EUC_CN`, `EUC_JP`, `EUC_KR`, `EUC_TW`, `ISO_8859_5`, `KOI8R`, `LATIN1` to `LATIN4`, `SJIS`, `WIN866`, `WIN1250`, `WIN1251` | | `SJIS` | _不支持做服務器端編碼_ | | `SQL_ASCII` | _任意(不會發生編碼轉換)_ | | `UHC` | _不支持做服務器端編碼_ | | `UTF8` | _所有支持的編碼_ | | `WIN866` | _WIN866_, `ISO_8859_5`, `KOI8R`, `MULE_INTERNAL`, `UTF8`, `WIN1251` | | `WIN874` | _WIN874_, `UTF8` | | `WIN1250` | _WIN1250_, `LATIN2`, `MULE_INTERNAL`, `UTF8` | | `WIN1251` | _WIN1251_, `ISO_8859_5`, `KOI8R`, `MULE_INTERNAL`, `UTF8`, `WIN866` | | `WIN1252` | _WIN1252_, `UTF8` | | `WIN1253` | _WIN1253_, `UTF8` | | `WIN1254` | _WIN1254_, `UTF8` | | `WIN1255` | _WIN1255_, `UTF8` | | `WIN1256` | _WIN1256_, `UTF8` | | `WIN1257` | _WIN1257_, `UTF8` | | `WIN1258` | _WIN1258_, `UTF8` | 要想打開自動字符集轉換功能,你必須告訴PostgreSQL 你想在客戶端使用的字符集(編碼)。 你可以用好幾種方法實現這個目的。 * 用psql里的`\encoding`命令。 `\encoding`允許你動態修改客戶端編碼。 比如,把編碼改變為`SJIS`,鍵入: ``` \encoding SJIS ``` * 使用libpq ([Section 31.10](#calibre_link-776))函數控制客戶端編碼。 * 使用`SET client_encoding TO`。使用下面的SQL命令設置客戶端編碼: ``` SET CLIENT_ENCODING TO '_value_'; ``` 你也可以使用標準的SQL語法`SET NAMES`達到這個目的: ``` SET NAMES '_value_'; ``` 查詢當前客戶端編碼: ``` SHOW client_encoding; ``` 返回缺省編碼: ``` RESET client_encoding; ``` * 使用`PGCLIENTENCODING`。如果在客戶端的環境里定義了 `PGCLIENTENCODING`環境變量,那么在與服務器進行連接時將自動選擇這個客戶端編碼。 這個編碼隨后可以用上面談到的任何其它方法覆蓋。 * 使用[client_encoding](#calibre_link-1030)配置變量。 如果在`client_encoding`里設置了該變量, 那么在與服務器建立了連接之后,將自動選定這個客戶端編碼。 這個設置隨后可以被上面提到的其它方法覆蓋。 假如無法進行特定的字符轉換— 比如, 你選的服務器編碼是`EUC_JP`而客戶端是`LATIN1`, 那么有些返回的日文字符不能轉換成`LATIN1` —這時將報告錯誤。 如果客戶端字符集定義成了`SQL_ASCII`, 那么編碼轉換會被關閉,不管服務器的字符集是什么都一樣。 和服務器一樣,除非你的工作環境全部是ASCII數據,否則使用`SQL_ASCII`是不明智的。 ## 22.3.4\. 進一步閱讀 下面是學習各種類型的編碼系統的好地方。 _CJKV Information Processing: Chinese, Japanese, Korean & Vietnamese Computing_ 包含`EUC_JP`, `EUC_CN`, `EUC_KR`, `EUC_TW`的詳細說明。 [http://www.unicode.org/](http://www.unicode.org/) Unicode主頁。 RFC 3629 UTF-8 (8-bit UCS/Unicode轉換格式)的定義。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看