Как я могу сохранить все "символы" UTF-16 в базе данных Postgres?
Краткий ответ, это невозможно напрямую, поскольку PostgreSQL поддерживает только набор символов UTF-8.
Форматы на основе UTF-16, такие как Java, JavaScript, Windows, могут содержать половинные суррогатные пары, которые не представлены в UTF-8 или UTF-32. Они могут быть легко созданы путем подстроки строки Java, JavaScript, VB.Net. Поскольку они не могут быть представлены в UTF-8 или UTF-32 и, следовательно, не могут быть сохранены в базе данных, которая поддерживает только набор символов UTF-8, такой как PostgreSQL.
Имена путей 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 обычно поддерживают такую кодировку.
Обратите внимание, что при использовании смайликов в виде кодовых точек Юникода вне Базовой многоязычной плоскости эти различия станут более актуальными и для западных пользователей.
На postgres вы можете:
а) принять потери,
б) хранить данные в виде двоичных данных
или же
в) перевести их на
закодированное представление (например, код JSON rfc кодирует их как два экранированных символа, чтобы иметь возможность передавать половину суррогатов в сетевом формате на основе UTF-8 / Ascii без потерь (https://tools.ietf.org/html/rfc4627 Раздел 2.5).
Например, Смайлики, находящиеся вне Базового многоязычного плана, эта проблема станет более актуальной и в западном мире.
В зависимости от выбора языка сервера приложений (Java, Scala, C # / Windows, JavaScript / NodeJS) и уровня инвестиций в языковую поддержку (с использованием, например, функций разделения строк ICU на границах графемы (* 1024) * вместо простого усечения проблема может быть менее актуальной, но большинство корпоративных систем и языков попадают в лагерь UTF-16 сегодня, когда программное обеспечение использует простые операции с подстрокой.