すべての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 )として読み取ることができない半分の代理ペアが含まれている場合があります。
Java / Android、JavaScript / NodeJS、.Net / wchar_t/Windows言語/プラットフォームにより適合したUTF-16/CESU-8文字セットをサポートするデータベースシステムを使用する必要があります。(SQLServer、Oracle(UTF-8照合)、DB2、Informix、HANA、SQL Anywhere、MaxDBは通常、このような文字セットをサポートしています。
基本多言語面の外側で絵文字がユニコードコードポイントとして表されているため、これらの違いは欧米のユーザーにとってもより適切になることに注意してください。
postgresでは、次のことができます。a)損失を受け入れる、b)データをバイナリデータとして保存する、またはc)エンコードされた表現に変換する(たとえば、JSON rfcはそれらを2つのエスケープ文字としてエンコードして、UTF内で半分のサロゲートを転送できるようにします-損失のない8/ASCIIベースのネットワーク形式(https://www.rfc-editor.org/rfc/rfc4627セクション2.5)。
たとえば、絵文字が基本多言語面の外側にある場合、この問題は西側世界でもより関連性が高くなります。
言語ApplicationServer(Java、Scala、C#/ Windows、JavaScript / NodeJS)の選択と、言語サポートへの投資のレベル(たとえば、書記素境界でのICU文字列分割関数(https://www.unicode)を使用)によって異なります。 org / reports / tr29 /#Grapheme_Cluster_Boundaries)単純な切り捨ての代わりに、問題の関連性は低くなる可能性があります。しかし、今日のエンタープライズシステムと言語の大部分は、単純なサブ文字列操作を使用するソフトウェアを使用してUTF-16キャンプに分類されます。