当使用Openfire在两个iOS设备之间聊天时(使用MySQL数据库),表情符号不能在离线聊天中工作

时间:2015-09-10 12:26:40

标签: mysql unicode xmpp openfire emoji

我遇到Openfire问题,特别是对表情符号的支持。我在互联网上搜索发现,为了支持表情符号,我必须将数据库和表格的编码和校对更改为UTF-8 unicode(utf8mb4)。我使用以下SQL命令完成了这项工作:

SET NAMES utf8mb4;  
ALTER DATABASE openfire CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;  
ALTER TABLE ofOffline CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;  

所以在上面的陈述中,我改变了数据库和表的字符集和整理。接下来,我读到我应该更改JDBC驱动程序以支持unicode。我对" database.defaultProvider.serverURL"有以下值:在我的系统属性中输入(使用Openfire管理网页):

jdbc:mysql://localhost:3306/openfire?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8

当我在两个在线用户之间使用表情符号发送消息时,它可以完美无瑕。当邮件的收件人处于脱机状态时,邮件将存储到数据库中,这就是出错的地方:表情符号未正确存储在数据库中(它存储为两个问号)。

我的CREATE TABLE语句如下所示:

CREATE TABLE `ofMessageArchive` (
  `messageID` bigint(20) DEFAULT NULL,
  `conversationID` bigint(20) NOT NULL,
  `fromJID` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `fromJIDResource` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `toJID` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `toJIDResource` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `sentDate` bigint(20) NOT NULL,
  `stanza` mediumtext COLLATE utf8mb4_unicode_ci,
  `body` mediumtext COLLATE utf8mb4_unicode_ci,
  KEY `ofMessageArchive_con_idx` (`conversationID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

我尝试使用以下查询获取节文本(包含表情符号)(请注意,消息73只包含一个字符:表情符号):

SELECT stanza, HEX(stanza) FROM ofOffline WHERE messageID = 73

这给了我(-的左边是消息,右边是十六进制值):

 - F09F9880

在数据库中插入节时(特别是存储了要传递给离线用户的消息的ofOffline表),执行以下代码:

String msgXML = message.getElement().asXML();

Connection con = null;
PreparedStatement pstmt = null;
try {
    con = DbConnectionManager.getConnection();
    pstmt = con.prepareStatement(INSERT_OFFLINE);
    pstmt.setString(1, username);
    pstmt.setLong(2, messageID);
    pstmt.setString(3, StringUtils.dateToMillis(new java.util.Date()));
    pstmt.setInt(4, msgXML.length());
    pstmt.setString(5, msgXML);
    pstmt.executeUpdate();
}

我不确定我现在可以尝试什么,或者是否有任何其他解决方法可以解决此问题。任何帮助将不胜感激。

提前致谢!

1 个答案:

答案 0 :(得分:4)

经过一番调查,我发现这个问题可能与Openfire使用的JDBC驱动程序有关。看起来连接字符串的参数没有被正确解析和使用,所以我更改了conf/openfire.xml中的JDBC连接驱动程序字符串并重新启动了服务器。现在,当我插入一个表情符号时,我收到以下错误:

java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x80</...' for column 'stanza' at row 1

在搜索了上述错误后,有人解释here我应该将以下内容添加到我的MySQL配置文件中:

[mysqld]
...
character-set-server = utf8mb4

此外,我可以从连接字符串中删除characterEncoding参数。在我做了这些更改后,重启MySQL和openfire,表情符号的插入开始工作。