Oracle не может хранить эмодзи - PullRequest
0 голосов
/ 05 октября 2018

У меня проблема с сохранением эмодзи в базе данных Oracle.Это простая программа на Java, которая берет пользовательский ввод с веб-страницы и сохраняет его в базе данных.

Вот как это выглядит перед сохранением в БД.

enter image description here

Вот как это выглядит при извлечении из базы данных.

enter image description here

Столбец базы данных, определенный как CLOB так что я ожидаю, что текст с эмодзи будет хорошо сохраняться.

Я также пытался сохранить и получить смайлики с помощью sqlplus, но также мне не повезло:

SQL> update emoji_table set emoji_column = 'Test ?' where emoji_table_id = 123;

1 row updated.

SQL> select emoji_column from emoji_table where emoji_table_id = 123;

EMOJI_TABLE
--------------------------------------------------------------------------------
Test ????

Полагаю, что возможнобыть проблема с кодировкой символов Oracle или что-то в этом роде.Не могли бы вы посоветовать, что может быть не так и где искать возможные исправления.

Спасибо

ОБНОВЛЕНИЕ # 1

По предложению Вернфрида ДомшайтаЯ проверил свой NLS_CHARACTERSET, и он выглядит так: WE8MSWIN1252 .

Поскольку я понимаю, что это является основной причиной проблемы, это не UTF-8, поэтому у него нет зарезервированного спискаemoji.

Вывод

select DUMP(emoji_column, 1016) from emoji_table where emoji_table_id = 123

следующий

ERROR at line 1:
ORA-00932: inconsistent datatypes: expected - got CLOB

Не могли бы вы посоветовать, как обойти?

ОБНОВЛЕНИЕ# 2

Вот вывод SQL-запроса DUMP:

select DUMP(TO_CHAR(emoji_column), 1016) from emoji_table where emoji_table_id = 123

DUMP(TO_CHAR(TEMPLATE),1016)
--------------------------------------------------------------------------------
Typ=1 Len=6 CharacterSet=WE8MSWIN1252: 42,6f,64,79,20,bf

Как я вижу, CharacterSet равен WE8MSWIN1252, что соответствует NLS_CHARACTERSET экземпляра Oracle.

Есть ли обходной путь для сохранения смайликов с WE8MSWIN1252?

Возможно, кодирование Base64 может быть обходным путем, но я хотел бы знать, есть ли лучшее решение.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Чтобы увидеть смайлики в sql * plus, сделайте следующее:

В Windowsэто будет:

chcp 65001
set NLS_LANG=.AL32UTF8
sqlplus ...

Что касается настроек в java, ознакомьтесь с Руководством разработчика по базе данных JDBC - Поддержка глобализации . Поскольку вы получаете данные как ???? Я предполагаю, что значение правильно вставлено в базу данных, так как ? равно U+1F602, то есть в UTF-8 F0 9F 98 82, то есть 4 байта.

Обновление:

Вы не можете хранить эмодзи Unicode, если ваш набор символов WE8MSWIN1252, который является только однобайтовым.Либо используйте NCLOB тип данных, либо перенесите базу данных в UTF-8, см. Миграция набора символов

0 голосов
/ 05 октября 2018

Вы можете полностью хранить эмодзи или любой другой многобайтовый символ в БД Oracle.

И посмотрите их в SQL Developer.

Моя БД имеет набор символов UTF-8.

Мой SQL Developer имеет дружественный к смайликам экранный шрифт.

У меня достаточно текстового поля, чтобы хранить их.

С установленным шрифтом дисплея 'Segoe UI Emoji

Они хранятся в CLOB, но достаточно широкий VARCHAR2 будет работать так же хорошо.

Если ваша кодировка БД не UTF-8 или аналогичная, вам может потребоваться использовать типы данных NCLOB или NVARCH2, предполагая, что у вас имеется расширенный набор символов.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...