【问题标题】:Oracle cannot store emojiOracle 无法存储表情符号
【发布时间】: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 编码可能是一种解决方法,但我想知道是否有更好的解决方案。

【问题讨论】:

标签: java oracle oracle11g


【解决方案1】:

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

并在 SQL Developer 中查看它们。

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

My SQL Developer 有一个对表情符号友好的显示字体。

我有一个足够宽的文本字段来存储这些。

显示字体设置为“Segoe UI Emoji”

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

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

【讨论】:

    【解决方案2】:

    为了在 sql*plus 中看到表情符号,请执行以下操作:

    在 Windows 上是:

    chcp 65001
    set NLS_LANG=.AL32UTF8
    sqlplus ...
    

    关于java中的设置,请看Database JDBC Developer's Guide - Globalization Support。 由于您以???? 获取数据,因此我假设该值已正确插入数据库,因为? 为U+1F602,即UTF-8 F0 9F 98 82,即4 字节。

    更新:

    当您的字符集为 WE8MSWIN1252(仅是单字节)时,您无法存储 Unicode 表情符号。使用NCLOB 数据类型或将您的数据库迁移到UTF-8,请参阅Character Set Migration

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 2017-05-05
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 2014-09-01
      • 2023-03-09
      相关资源
      最近更新 更多