Oracle 无法存储表情符号

我在将表情符号保存到 Oracle 数据库时遇到问题。这是一个简单的 Java 程序,它从网页获取用户输入并将其保存到数据库中。

这是我保存到数据库之前的样子。

http://img4.mukewang.com/617a47b90001600702280059.jpg

这就是它从数据库中检索它时的样子。

http://img1.mukewang.com/617a47c50001007402320064.jpg

数据库列定义为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

正如我所看到的 CharacterSetWE8MSWIN1252与NLS_CHARACTERSETOracle 实例的匹配。


有没有办法用 来保存表情符号WE8MSWIN1252?


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


小怪兽爱吃肉
浏览 434回答 2
2回答

缥缈止盈

您可以在 Oracle DB 中完全存储表情符号或任何其他多字节字符。并在 SQL Developer 中查看它们。我的数据库有一个 UTF-8 字符集。My SQL Developer 有一个表情友好的显示字体。我有一个足够宽的文本字段来存储这些。显示字体设置为“Segoe UI Emoji”它们存储在 CLOB 中,但足够宽的 VARCHAR2 也能正常工作。如果您的 db 字符集不是 UTF-8 或类似字符集,则您可能需要依赖 NCLOB 或 NVARCH2 数据类型(假设您有可用的扩展字符集)。

大话西游666

为了在 sql*plus 中看到表情符号,请执行以下操作:选择能够显示表情符号的字体(请参阅FACE WITH TEARS OF JOY (U+1F602) 字体支持)将控制台的字符集设置为 UTF-8设置NLS_LANG相应运行 slqplus在 Windows 上,它将是:chcp 65001  set NLS_LANG=.AL32UTF8 sqlplus ...关于java中的设置,请查看Database JDBC Developer's Guide - Globalization Support。更新:当您的字符集WE8MSWIN1252仅为单字节时,您无法存储 Unicode 表情符号。使用NCLOB数据类型或将数据库迁移到 UTF-8,请参阅字符集迁移
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java