如何将所有 UTF-16“字符”存储在 Postgres 数据库中?
简短的回答,这是不可能的,因为 PostgreSQL 只支持 UTF-8 字符集。
Java、JavaScript、Windows 等基于 UTF-16 的格式可以包含一半代理对,它们在 UTF-8 或 UTF-32 中没有表示。这些可以很容易地通过子串化 Java、JavaScript、VB.Net 字符串来创建。因为它们不能用UTF-8 或 UTF-32 表示,因此不能存储在像 PostgreSQL 这样只支持 UTF-8 字符集的数据库中。
Windows 路径名称可能包含无法读取为 utf-8 ( https://github.com/rust-lang/rust/issues/12056 ) 的一半代理对。
必须使用支持 UTF-16/CESU-8 字符集的数据库系统,该字符集更适合 Java/Android、JavaScript/NodeJS、.Net/wchar_t/Windows 语言/平台。(SQLServer、Oracle(UTF-8 排序规则)、DB2、Informix、HANA、SQL Anywhere、MaxDB 通常支持这样的字符集。
请注意,随着表情符号在基本多语言平面之外表示为 unicode 代码点,这些差异对于西方用户也将变得更加相关。
在 postgres 上,您可以:a)接受损失,b)将数据存储为二进制数据或 c)将它们转换为编码表示(例如 JSON rfc 将它们编码为两个转义字符,以便能够在 UTF- 8/基于 Ascii 的无损失网络格式(https://www.rfc-editor.org/rfc/rfc4627第 2.5 节)。
例如,表情符号位于基本多语言平面之外,这个问题在西方世界也将变得更加相关。
取决于语言应用服务器(Java、Scala、C#/Windows、JavaScript/NodeJS)与 go 的选择以及对语言支持的投资水平(例如在字素边界使用 ICU 字符串拆分功能(https://www.unicode. org/reports/tr29/#Grapheme_Cluster_Boundaries)而不是简单的截断问题可能不太相关。但是今天大多数企业系统和语言都属于 UTF-16 阵营,软件使用简单的子字符串操作。