MySql и JDBC: изменить кодировку одного столбца на utf8mb4

У меня есть «старая» база данных (в utf 8), где я читаю и пишу с помощью JDBC. Теперь я также должен иметь возможность хранить смайлики в столбце моей таблицы. Я изменил кодировку задействованных столбцов на utf8mb4:

ALTER TABLE
myTable
CHANGE column_name column_name
longtext
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci
NOT NULL;

Однако, когда я пытаюсь вставить смайлик в этот столбец, я получаю известную ошибку

java.sql.SQLException: Incorrect string value: '\xF0\x9F\x91\x8D\xF0\x9F...'

Должен ли я преобразовать всю базу данных или я делаю что-то не так?


person giozh    schedule 16.08.2019    source источник
comment
Какую версию MySQL Connector/J вы используете и какие свойства соединения вы используете? Вы установили для свойства сервера MySQL character_set_server значение utf8mb4 или нет?   -  person Mark Rotteveel    schedule 16.08.2019
comment
Укажите SHOW CREATE TABLE myTable -- я не буду проверять правильность объявления столбца.   -  person Rick James    schedule 17.08.2019


Ответы (1)


Нужно подключиться к utf8mb4, чтобы получить ???? и т. д.

?useUnicode=yes&characterEncoding=UTF-8 в вызове getConnection().

В качестве запасного варианта выполните SET NAMES utf8mb4 после подключения. (См. комментарий.)

«Для Connector/J 8.0.12 и более ранних версий: чтобы использовать набор символов utf8mb4 для подключения, сервер ДОЛЖЕН быть настроен с character_set_server=utf8mb4; если это не так, когда UTF-8 используется для characterEncoding в строке подключения , он будет сопоставлен с именем набора символов MySQL utf8, которое является псевдонимом для utf8mb3.'

person Rick James    schedule 17.08.2019
comment
документация MySQL Connector/J явно указывает не использовать SET NAMES: Предупреждение: не выполняйте запрос SET NAMES с Connector/J, так как драйвер не обнаружит, что набор символов был изменен запросом, и будет продолжать использовать символ set настроен при первой установке соединения. - person Mark Rotteveel; 17.08.2019
comment
Подтверждено с помощью MySQL Connector/J версии 8.0.17. Все, что требуется, это useUnicode=true&characterEncoding=utf8 в URL-адресе подключения. Это было верно даже тогда, когда набор символов по умолчанию для сервера был latin1, а набор символов по умолчанию для базы данных был utf8 (а не utf8mb4). - person Gord Thompson; 17.08.2019