将表情符号保存到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
编码可能是一种解决方法,但我想知道是否有更好的解决方案。
答案 0 :(得分:3)
您可以将表情符号或任何其他多字节字符完全存储在Oracle DB中。
并在SQL Developer中查看它们。
我的数据库具有UTF-8字符集。
我的SQL Developer具有表情符号友好的显示字体。
我的文本字段足够存储这些内容。
将显示字体设置为“ Segoe UI表情符号”
这些存储在CLOB中,但是足够宽的VARCHAR2也可以工作。
如果您的数据库字符集不是UTF-8或类似字符,则可能需要依靠NCLOB或NVARCH2数据类型,前提是您拥有可用的扩展字符集。
答案 1 :(得分:3)
要查看sql * plus中的表情符号,请执行以下操作:
MemoryFileSystem.store
在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