Использование chardet для обнаружения плохой кодировки в базе данных MySQL с JDBC

Недавно мы переместили нашу базу данных 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 в БД , независимо от того, как вы его получите, это именно то, что есть (забавные персонажи и все такое)?

Спасибо!

11
задан bnferguson 29 October 2012 в 17:30
поделиться