作為項目的一部分,我們需要從 Ubuntu 14.04 遷移到 Ubuntu 16.04。但是,自升級完成后,所有功能都無法正常運行。存儲在數據庫中時字符的編碼是混亂的。相同的 debian 版本的軟件會產生不同的結果,這意味著 ISO 問題與不同的庫或 Java 行為存在一些差異。升級后的服務器沒有遇到任何問題,它只在較新的安裝上持續存在,這意味著 ISO 級別存在問題,但沒有明顯跡象表明哪個庫或類似庫可能安裝失敗。添加了日志記錄以打印接收到的字節,并且 Java 仍然按預期讀取它。但是,當它把它們存儲在數據庫中時,它們就完全不同了。這是通過之前的 JPA 連接設置完成的。這已經在使用“useUnicode=true&characterEncoding=UTF-8”字段。當 Java 再次讀取此數據時,它仍然認為它使用的是正確的字節,但實際上并非如此。同樣,如果你直接向數據庫中添加一些東西,Java 的調試日志不會顯示正確的字節,但是當通過只能通過這里的接口顯示時,信息仍然正確顯示。這意味著問題在于存儲數據而不是處理數據,但是相同版本的 debian 安裝會影響兩個版本。例如,阿拉伯語中的 ???? 應該被編碼為(通過在 mysql/mariadb 中使用十六進制函數),在正確的版本中顯示為“D8B4D984D8A7D8A4”,但在不正確的版本中顯示為“C398C2B4C399C284C398C2A7C398C2A4”。這可能會提供有關編碼無法正常工作的原因的更多信息。Java 讀取不正確的字節就好像它們是正確的一樣,這更可能是 Java 的問題,但由于系統之間的不一致,混亂仍然存在。
2 回答

嚕嚕噠
TA貢獻1784條經驗 獲得超7個贊
對于可能遇到類似情況的任何人,結果是 Java 在沒有默認為 utf8 的情況下運行。OpenEJB/JPA 配置正確,數據庫也是如此,但服務器的一個方面默認為不同的字符集,因此受影響區域的啟動參數解決了問題!

aluckdog
TA貢獻1847條經驗 獲得超7個贊
D8B4D984D8A7D8A4
是正確的 utf8(或 utf8mb4)編碼????
。 C398C2B4C399C284C398C2A7C398C2A4
是“雙編碼”版本。這意味著某些東西仍然指定“latin1”作為字符集。也許您轉儲并重新加載了數據,這就是它發生的地方?
有關更多信息,請參閱UTF-8 字符問題;我看到的不是我存儲的,也許是http://mysql.rjweb.org/doc.php/charcoll
添加回答
舉報
0/150
提交
取消