代码之家  ›  专栏  ›  技术社区  ›  endryha

Oracle无法存储emoji

  •  0
  • endryha  · 技术社区  · 7 年前

    这是一个简单的Java程序,它从网页获取用户输入并将其保存到数据库中。

    enter image description here

    enter image description here

    数据库列定义为 CLOB

    我还尝试用sqlplus保存和检索emoji,但也没有成功:

    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 ????
    

    我想可能是甲骨文字符编码或类似的问题。 你能告诉我可能出了什么问题,在哪里寻找可能的解决方法吗。

    谢谢你

    更新#1

    WE8MSWIN1252型 .

    据我所知,这是问题的根本原因,它不是UTF-8,因此没有保留的emoji列表。

    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

    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
    

    如我所见,字符集是 WE8MSWIN1252 NLS_CHARACTERSET Oracle实例的。

    有没有解决方法来保存emoji WE8MSWIN1252型 ?

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

    2 回复  |  直到 7 年前
        1
  •  3
  •   thatjeffsmith    7 年前

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

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

    我的SQL开发人员有一个友好的emoji显示字体。

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

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

    如果db charset不是UTF-8或类似类型,则可能需要依赖于nclb或NVARCH2数据类型(假设有可用的扩展字符集)。

    enter image description here

        2
  •  3
  •   Wernfried Domscheit    7 年前

    要在sql*plus中查看emoji,请执行以下操作:

    chcp 65001
    set NLS_LANG=.AL32UTF8
    sqlplus ...
    

    关于java中的设置,请查看 Database JDBC Developer's Guide - Globalization Support . 因为你得到的数据是 ???? 我假设该值正确地插入到数据库中 😂 U+1F602 ,这是UTF-8格式的 F0 9F 98 82

    WE8MSWIN1252 只有一个字节。要么使用 NCLOB Character Set Migration