【发布时间】:2018-10-10 17:00:42
【问题描述】:
我在将表情符号保存到 Oracle 数据库时遇到问题。 这是一个简单的 Java 程序,它从网页中获取用户输入并将其保存到数据库中。
这是我保存到数据库之前的样子。
这就是它从数据库中检索它时的样子。
数据库列定义为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 编码可能是一种解决方法,但我想知道是否有更好的解决方案。
【问题讨论】:
-
您需要使您的专栏
NCLOB支持unicode 或更改为数据库本身以支持unicode。见Supporting Multilingual Databases with Unicode -
你的数据库的
NLS_CHARACTERSET是什么? -
你从
select DUMP(emoji_column, 1016) from emoji_table where emoji_table_id = 123得到什么? -
那就试试
DUMP(TO_CHAR(emoji_column), 1016)