Имеем:
- Последний 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