gpt4 book ai didi

java - 使用 chardet 检测带有 JDBC 的 MySQL 数据库中的错误编码

转载 作者:IT王子 更新时间:2023-10-29 00:28:44 38 4
gpt4 key购买 nike

最近我们将 mysql 数据库从 Latin1 移到了 UTF8。在尝试了几种不同的方法来转换它之后,我们无法找到任何不会引入一些非常讨厌的数据丢失的方法(而且许多方法根本什么都不做)。

这让我想知道我们是否有很多不同的编码正在进行,因为似乎没有一种方法可以涵盖我们的测试用例(我们数据库中的各种帖子)。为了检验这个理论,我写了一个小的 scala 应用程序(我的第一个应用程序,请随意取笑它是多么的乱七八糟和非惯用语!:D),它使用 chardet 查看帖子并告诉我编码。

只有一个问题,一切都是UTF8。

代码如下:

package main.scala

import org.mozilla.universalchardet.UniversalDetector
import java.sql.DriverManager

object DBConvert {
def main(args: Array[String]) {
val detector = new UniversalDetector(null)
val db_conn_str = "jdbc:mysql://localhost:3306/mt_pre?user=root"
val connection = DriverManager.getConnection(db_conn_str)

try {
val statement = connection.createStatement()
val rs = statement.executeQuery("SELECT * FROM mt_entry where entry_id = 3886")
while (rs.next) {
val buffer = rs.getBytes("entry_text_more")
detector.handleData(buffer, 0, buffer.length)
detector.dataEnd()

val encoding:String = detector.getDetectedCharset;

if (encoding != null) println("Detected encoding = " + encoding) else println("No encoding detected.");

detector.reset();

// Just so we can see the output
println(rs.getString("entry_text_more"))
}
} catch {
case _ => e: Exception => println(e.getMessage)
}
finally {
connection.close()
}
}
}

我尝试将 useUnicode 传递给 JDBC 查询字符串,还有 characterEncoding。他们都没有动摇 UTF-8 总是出来。还尝试使用 getBinaryStream 和其他,仍然是 UTF-8。

完全承认字符编码让我有些头疼,使用一种新语言可能不是解决这个问题的最佳方法。 :) 那就是说我很好奇 - 有没有一种方法可以从数据库中获取数据并检测将其放入其中的编码方式,或者它只是因为它在数据库中被编码为 UTF-8 而只是其中之一,无论您如何检索它,它就是它的本来面目(有趣的角色和所有)?

谢谢!

最佳答案

我曾经遇到过类似的问题。看这个answer .在连接字符串中设置编码可能会有所帮助。

关于java - 使用 chardet 检测带有 JDBC 的 MySQL 数据库中的错误编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7562115/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com