У меня проблема с Openfire и особенно поддержка символов emoji. Я искал в Интернете, узнал, что для поддержки emoji мне нужно изменить кодировку и сопоставление базы данных и таблиц в unicode UTF-8 (utf8mb4). Я сделал это с помощью следующей SQL-команд:Emoji не работает в автономном чате при использовании Openfire для чата между двумя устройствами iOS (с использованием MySQL db)
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
Когда я отправляю сообщения с смайликам между двумя интернет-пользователей, это работает безупречно , Когда получатель сообщения находится в автономном режиме, сообщение сохраняется в базе данных, и это происходит неправильно: emoji неправильно хранится в базе данных (он хранится в виде двух вопросительных знаков).
Мой 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 содержит только один характер: Emoji):
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();
}
Я не уверен, что Я могу попробовать сейчас или есть ли другие способы обхода проблемы. Любая помощь будет принята с благодарностью.
Заранее благодарен!
2 вопрос знак? Не 1 или 4? Пожалуйста, предоставьте 'SHOW CREATE TABLE'. –
@RickJames Я предоставил вывод 'CREATE TABLE'. – Devos50
Вы говорите, что это «хранится как 2 вопросительных знака». Но, возможно, он хранится правильно, но неправильно загружен. Пожалуйста, предоставьте 'SELECT emoji, HEX (emoji) FROM tbl WHERE ...'поэтому мы можем видеть гекс, который находится в таблице. –