日齡問題,從MySql數據庫返回查詢時,我得到的字符如ç而不是ç。如何解決MySql的JSON和Java的編碼問題?
我使用的是一個非常簡單的類來嘗試釘住問題了下來:
package com.dataTest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class EncodingTest {
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager
.getConnection("jdbc:mysql://internalip:3306/databasename?" +
"user=user" +
"&password=password" +
"&characterEncoding=utf-8" +
"&useUnicode=yes");
PreparedStatement stmt =
connection.prepareStatement("SELECT * FROM `databasename`.teste_json;");
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("info"));
}
rs.close();
stmt.close();
connection.close();
}
}
的信息加入到通過其他類的數據庫,但我把它使用手動工作臺改變,問題依然存在。
數據庫歸類爲utf8_general_ci,表編碼爲utf8。
我真的不知道該怎麼做。
編輯:
我複製JSON字符串爲varchar(1500)字段,並將其完全打印。我忘了提及,查詢(info)中提到的字段是JSON字段。
編輯2:它不是mojibake?
問題被關閉基於裏克詹姆斯答案聲稱這是Mojibake。
Acording的問題Trouble with utf8 characters; what I see is not what I stored以下觀察:
- 該字節被存儲需要是UTF-8編碼的。解決這個問題。
我認爲他們存儲正確。我做了一個簡單的JSON的HEX,長度和CHAR_LENGTH這樣的:
'[{\"é\": \"\"}]', '5B7B22C3A9223A2022227D5D', '12', '11'
- 連接插入和選擇文本需要指定UTF8或utf8mb4時。解決這個問題。
的連接字符串指定的字符集:
&useUnicode=yes&characterEncoding=UTF-8
- 列需要聲明CHARACTER SET UTF8(或utf8mb4)。解決這個問題。
那麼,數據庫已字符集/覈對= UTF8/utf8_general_ci 該表具有核對utf8_unicode_ci 的JSON柱(這是有問題的一個)沒有歸類。
有多奇怪。
手動狀態
MySQL的處理使用utf8mb4字符集和utf8mb4_bin覈對在JSON上下文中使用字符串。其他字符集中的字符串將根據需要轉換爲utf8mb4。 (對於ascii或utf8字符集中的字符串,不需要轉換,因爲ascii和utf8是utf8mb4的子集。)
從https://dev.mysql.com/doc/refman/5.7/en/json.html
這是否意味着實際整理已經是正確的?
據我所知,插入服務器的信息是正確的(見HEX信息),所以問題是選擇?但連接字符串似乎在所有形式中都是正確的。
編輯:不是一個複製。
在這種情況下的問題與其他問題中的問題不同,請參閱我自己對此問題的回答以及所提及的錯誤報告。
根據這些https://dev.mysql.com/doc/refman/5.7/en/json,您可能會遇到一些問題。html#json轉換類型和https://bugs.mysql.com/bug.php?id=81677 – pvg
表的字符集/排序規則是每列的_default_。所以,如果專欄是沉默的,看看這張表。 –
表格的整理是utf8_general_ci,如問題所述。 –