jdbc: неверная кодировка при работе с БД


Имеем:

  • Последний mysql connector/j
  • Кодировку БД, таблиц и полей в utf8_general_ci
  • Системную кодировку системы(древний ASP Linux) – cp1251
  • Принудительную установку кодировки при и после подключения:

    String connectionString = "jdbc:mysql://www.box/database"
    + "?useUnicode=true&characterEncoding=UTF-8"
    + "&charSet=UTF-8&encoding=UTF-8";
    Connection con = DriverManager.getConnection(connectionString,
    "someuser", "somepass");
    con.prepareStatement("SET CHARSET \"utf8\"").executeUpdate();
    con.prepareStatement("SET NAMES \"utf8\"").executeUpdate();

По факту в базу вставляются записи в виде абракадабры. Казалось бы – настроил всё что можно, причём однозначно везде юникод, что может быть не так?

Запуск jar с другого компьютера

Удивило, но когда я запустил скомпилированный jar с генты(www.box это реальный сервер в локалке) – записи стали добавляться действительно в юникоде!
Это повод подумать – ведь по факту, какая разница: сервер бд вообще не изменился – тот же что и был, виртуальные машины везде версии 1.6, mysql connector тот же..

Опаньки

Подсказку в какую сторону думать я дал в начале, когда указал, что кривые записи вставляются при запуске на древней системе с системной кодировкой cp1251(в ASP вроде как некоторое время считали что надо её ставить как приоритетную)

Решение

Всё, что нужно сделать перезд запуском – выправить кодировку в текущей локали перед запуском джава приложения:

$ export LANG=ru_RU.UTF-8
$ java -jar dist/project.jar