Использование chardet для обнаружения плохой кодировки в базе данных MySQL с JDBC - PullRequest
11 голосов
/ 27 сентября 2011

Недавно мы перевели нашу базу данных mysql с Latin1 на UTF8.Попробовав несколько разных подходов для его преобразования, мы не смогли найти ни одного, который бы также не вводил довольно неприятные потери данных (а многие просто ничего не делали).

Это заставило меня задуматься, не происходит ли у нас много разных кодировок, поскольку, похоже, не существует единого подхода, охватывающего наши тестовые случаи (различные записи в нашей базе данных).Чтобы проверить эту теорию, я написал небольшое приложение для scala (мое первое, не стесняйтесь высмеивать, насколько оно мощно и не идиоматично!), Которое использовало 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, также символьную кодировку.Ни один из них не сдвинулся с места, UTF-8 всегда выходил.Также пытался использовать getBinaryStream и другие, все еще в UTF-8.

Полностью признаю, что кодировка символов заставляет мою голову немного изгибаться, и игра на новом языке может быть не лучшим способом решения этой проблемы.:) Тем не менее, мне любопытно - есть ли способ получить данные из БД и определить, в какую кодировку они были записаны, или это одна из тех вещей, которые просто кодируются как UTF-8 в БДнезависимо от того, как вы получаете его, это только то, что это (забавные персонажи и все)?

Спасибо!

Ответы [ 2 ]

1 голос
/ 17 июня 2012

Однажды у меня была похожая проблема.Смотрите этот ответ .Может помочь установка кодировки внутри строки подключения.

0 голосов
/ 26 августа 2012

Обратите внимание, что Table Charset и Connection CHarset и кодировка базы данных по умолчанию - все это UTF-8. У меня был один экземпляр, в котором база данных Datbases по умолчанию была UTF-8, но столбцы таблицы все еще были латинскими, поэтому у меня были некоторые проблемы. Пожалуйста, посмотрите, если это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...