2016-05-06 12 views
2

У меня есть эта таблица MySQL в производстве, которая имеет charset latin1_swedish_ci (aka latin1).«Неверное строковое значение:« Ошибка MySQL при вставке текста UTF8 в столбец latin1

Прямо сейчас, есть этот входящий контент (String: «\ ud55c \ ubc24 \ uc758») в формате UTF-8, который должен быть вставлен в это поле столбца TEXT называется ключевые слова в таблице.

Когда я пытаюсь выполнить INSERT, я получаю эту ошибку:

Incorrect string value: '\xED\x95\x9C\xEB\xB0\xA4...' for column 'keywords' at row 1 

Я попробовал все виды способов в моей Java-кода, чтобы попытаться преобразовать из UTF8 в ISO-8859-1, как это ниже и я все еще получаю ту же ошибку:

String convertedString = new String(originalString.getBytes("UTF-8"), "ISO-8859-1"); 

Я знаю, что есть решения на StackOverflow, которые упоминают изменить кодировку таблицы MySQL в UTF8 из latin1, и я, к сожалению, не могу этого сделать, потому что это живая продукция MySQL-сервер, а также он исторически был нами латинский1.

У кого-нибудь есть предложения по исправлению ошибки «Неверное строковое значение»?

Благодаря IS

+0

Вам необходимо изменить кодировку _in Java_ с usc2 на utf8. 'ISO-8859-1' нигде не участвует в том, что вы показываете. Вы надеялись на '' ', правильно? –

+0

Привет, Рик Джеймс, спасибо за быстрый ответ. Что вы понимаете, изменив кодировку с usc2 на utf8? Извините, я не следую. И да, я хотел бы добраться до 한밤 – user1805458

+0

Так что раньше был старый скрипт Python, который читал бы этот текст в Юникоде из другой базы данных MySQL (в utf-8) и записывал его в эту базу данных latin1 MySQL, и этот текст показывал бы Как я могу понять, как преобразовать «\ ud55c \ ubc24 \ uc758» в «í • œë ° ¤ì~» в моем Java-коде, тогда я хорошо – user1805458

ответ

0

Что вы пытаетесь сделать, просто не представляется возможным, если символы в строке utf8 также не случается, есть представительства в latin1 ... и latin1 крошечное однобайтная характер set (менее 256 возможных символов, всего), поэтому подавляющее большинство действительных символов utf8 не имеют эквивалентного представления latin1.

Вы не можете сохранить символ в столбце, который не поддерживается символьным набором столбца. Это не вопрос «конвертации» из одного в другой.

Если вам нужен юникод, вам нужен хотя бы столбец utf8, и изменение таблицы является единственной альтернативой. Попытка сделать иначе - это как попытка сохранить отрицательное число в столбце целых чисел без знака. Unsigned ints не может быть отрицательным - это не вопрос конверсии.

Это относится к любой СУБД, которая поддерживает типы символьных данных и не является ограничением, характерным для MySQL.

+0

Привет, Майкл, спасибо за Ответить. Таким образом, существовал старый скрипт Python, который читал бы этот текст Юникода из другой базы данных MySQL (в utf-8) и записывал бы его в эту базу данных MySQL latin1, и этот текст будет отображаться как «œ • ë ° ¤ì~ Если я может понять, как преобразовать «\ ud55c \ ubc24 \ uc758» в «í • œë ° ¤ì~» в моем Java-коде, тогда я хорош – user1805458

0

한밤 является Mojibake для 한밤 - именно там он был преобразован в latin1 на определенном этапе. Но \ud55c\ubc24 - это Юникод. В каком режиме находится Python? У вас это есть в начале?

# -*- coding: utf-8 -*- 

More Python checklist.

Подробнее

utf8 является предпочтительным; euckr возможен. Но ... Проблема заключается не в выборе набора символов, а в согласовании во всем приложении при указании этого набора символов.

Вы используете Python? Он помечен Java?

Для Java/JDBC в вызове getConnection() требуется ?useUnicode=yes&characterEncoding=UTF-8.

Вам нужно это:

  • байт в вашем клиенте должно быть utf8, например гексом ED959C. (Корейские символы - все 3 байта в utf8.)
  • Соединение между клиентом и сервером должно быть utf8. Выполнение SET NAMES utf8 сразу после подключения - это еще один способ сделать это.
  • Стол/стол должен быть CHARACTER SET utf8.
  • Если вы используете html, вам понадобится <meta charset=UTF-8>.

Для корейцев utf8mb4 не имеет значения utf8. Проверьте эти четыре предмета, указанные выше, и «докажите» нам, что вы делаете все из них.

Для сервлетов JSP и Java, немного отличающихся advice гарантируется.

+0

Привет, Рик, да, я вижу «# - * - кодирование: utf -8 - * - "в верхней части файла Python – user1805458

+0

Что-нибудь полезное в ссылке контрольного списка? –

+0

К сожалению, пока нет, но я попытался использовать другое преобразование в коде Java. Когда я пытаюсь преобразовать в Cp1252 вместо ISO-8859-1, используя «новую строку» (keywords.getBytes («UTF-8»), «Cp1252»), я заметил что-то интересное – user1805458