Какой смысл в строке
String data = new String(this.request.getParameter("data").getBytes("ISO-8859-1"), "UTF-8");
Вы преобразуете китайские (или, по крайней мере, не случайные) символы в байты, используя кодировку ISO-8859-1.Конечно, это не может работать, так как китайские символы не поддерживаются кодировкой ISO-8859-1.И затем вы создаете новую строку из байтов, которые должны представлять символы в кодировке ISO-8859-1, используя кодировку UTF-8.Это, опять же, не имеет никакого смысла.UTF-8 и ISO-8859-1 - это не одно и то же, и только небольшой набор символов имеет одинаковую кодировку в обоих форматах.
Просто используйте
String data = this.request.getParameter("data");
, и все должновсе будет в порядке, при условии, что в столбце таблицы MySQL используется кодировка, которая поддерживает эти символы.
РЕДАКТИРОВАТЬ:
теперь, когда вы показали нам код, используемый для вставки данных в базу данных,Я знаю, откуда все это происходит (хотя предыдущие пункты все еще действительны).Вы делаете
StringEscapeUtils.escapeJava(inventory.getItemData())
Какой смысл?escapeJava
используется для получения строки и экранирования специальных символов, чтобы сделать ее действительным литералом Java String.Это не имеет ничего общего с SQL.Используйте подготовленный оператор:
String sql = "INSERT INTO Inventory (uid, item_id, item_data, ctime) VALUES (?, ?, ?, CURRENT_TIMESTAMP);
PreparedStatement stmt = con.prepareStatement();
stmt.setInteger(1, inventory.getUid()); // or setLong, depending on the type
stmt.setString(2, inventory.getItemId());
stmt.setString(inventory.getItemData());
int cnt = stmt.executeUpdate();
PreparedStatement позаботится о правильном экранировании специальных символов SQL.Это лучший инструмент против атаки SQL-инъекцией, и его всегда следует использовать, когда у запроса есть параметры, особенно если параметры поступают от конечного пользователя.См http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html.