Oracle无法存储表情符号

时间:2018-10-05 13:03:17

标签: java oracle oracle11g

将表情符号保存到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

根据Wernfried Domscheit的建议,我检查了我的NLS_CHARACTERSET,它似乎是 WE8MSWIN1252

据我了解,这是问题的根本原因,它不是UTF-8,因此没有保留的表情符号列表。

的输出
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

这是DUMP sql查询的输出:

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,与Oracle实例的NLS_CHARACTERSET相匹配。

是否存在一种解决方法,可以用WE8MSWIN1252保存表情符号?

可能Base64编码可能是一种解决方法,但我想知道是否有更好的解决方案。

2 个答案:

答案 0 :(得分:3)

您可以将表情符号或任何其他多字节字符完全存储在Oracle DB中。

并在SQL Developer中查看它们。

我的数据库具有UTF-8字符集。

我的SQL Developer具有表情符号友好的显示字体。

我的文本字段足够存储这些内容。

将显示字体设置为“ Segoe UI表情符号”

这些存储在CLOB中,但是足够宽的VARCHAR2也可以工作。

如果您的数据库字符集不是UTF-8或类似字符,则可能需要依靠NCLOB或NVARCH2数据类型,前提是您拥有可用的扩展字符集。

enter image description here

答案 1 :(得分:3)

要查看sql * plus中的表情符号,请执行以下操作:

在Windows上是:

NLS_LANG

关于Java中的设置,请查看Database JDBC Developer's Guide - Globalization Support由于您以chcp 65001 set NLS_LANG=.AL32UTF8 sqlplus ... 的形式获取数据,所以我假设该值已正确插入到数据库中,因为????,采用UTF-8 U+1F602格式,即4字节

更新

当字符集为F0 9F 98 82(仅为单字节)时,无法存储Unicode表情符号。使用WE8MSWIN1252数据类型或将数据库迁移到UTF-8,请参见Character Set Migration