Вот как устанавливается мое соединение:
Connection conn = DriverManager.getConnection(url + dbName + "?useUnicode=true&characterEncoding=utf-8", userName, password);
И я получаю следующую ошибку при попытке добавить строку в таблицу:
Incorrect string value: '\xF0\x90\x8D\x83\xF0\x90...' for column 'content' at row 1
Я вставляю тысячи записей, и я всегда получаю эту ошибку, когда текст содержит \ xF0 (т.е. неправильное значение строки всегда начинается с \ xF0).
Сортировка столбца - utf8_general_ci.
В чем может быть проблема?
Ответы:
MySQL
utf8
разрешает только символы Unicode, которые могут быть представлены 3 байтами в UTF-8. Здесь у вас есть символ, которому нужно 4 байта: \ xF0 \ x90 \ x8D \ x83 ( U + 10343 GOTHIC LETTER SAUIL ).Если у вас MySQL 5.5 или новее, вы можете изменить кодировку столбца с
utf8
наutf8mb4
. Эта кодировка позволяет хранить символы, занимающие 4 байта в UTF-8.Вы можете также установить свойство сервера ,
character_set_server
чтобыutf8mb4
в файле конфигурации MySQL. Похоже, что Connector / J по умолчанию использует 3-байтовый Unicode, в противном случае :источник
character_encoding_server
не является допустимым именем переменной конфигурации MySQL. Я попытался установить ,character_set_server
чтобыutf8mb4
вместо этого, в дополнение к отдельным колонкам, но это ничего не изменило.Строки, которые содержат
\xF0
это просто символы, закодированные в несколько байтов с использованием UTF-8.Хотя ваша сортировка установлена на utf8_general_ci, я подозреваю, что кодировка символов базы данных, таблицы или даже столбца может отличаться. Это независимые настройки . Пытаться:
Замените любой фактический тип данных на VARCHAR (255).
источник
file-encoding
параметром, указывающим UTF-8, например,java -Dfile.encoding=UTF-8
или добавьте соответствующий переключатель в файл конфигурации Tomcat (и т. Д.).Возникла та же проблема, для сохранения данных
utf8mb4
необходимо убедиться:character_set_client, character_set_connection, character_set_results
являютсяutf8mb4
:character_set_client
иcharacter_set_connection
указывают набор символов, в котором операторы отправляются клиентом,character_set_results
указывает набор символов, в котором сервер возвращает результаты запроса клиенту.Смотрите кодировку-соединение .
кодировка таблицы и столбца
utf8mb4
Для JDBC есть два решения:
Решение 1 (необходимо перезапустить MySQL):
измените,
my.cnf
как показано ниже, и перезапустите MySQL:это может убедиться , что база данных и
character_set_client, character_set_connection, character_set_results
являетсяutf8mb4
по умолчанию.перезапустите MySQL
изменить кодировку таблицы и столбца на
utf8mb4
СТОП указания
characterEncoding=UTF-8
иcharacterSetResults=UTF-8
в JDBC разъем, причиной этого будет перекрыватьcharacter_set_client
,character_set_connection
,character_set_results
чтобыutf8
Решение второе (не нужно перезапускать MySQL):
изменить кодировку таблицы и столбца на
utf8mb4
указание
characterEncoding=UTF-8
в коннекторе jdbc, потому что коннектор jdbc не поддерживаетutf8mb4
.напишите свой sql statment, как это (нужно добавить
allowMultiQueries=true
в JDBC коннектор):это будет убедиться , что каждое соединение с сервером,
character_set_client,character_set_connection,character_set_results
являютсяutf8mb4
.Также см. Charset-соединение .
источник
SELECT
запросам, так какset names utf8mb4; select ... from ...
он никогда не выдастResultSet
и вместо этого приведет кResultSet is from UPDATE. No Data.
ошибке.Я хотел объединить пару постов, чтобы получить полный ответ на это, так как это, кажется, несколько шагов.
/etc/mysql/my.cnf
или/etc/mysql/mysql.conf.d/mysqld.cnf
Опять из совета прежде всего jdbc-соединения были
characterEncoding=UTF-8
иcharacterSetResults=UTF-8
удалены из нихС этим набором,
-Dfile.encoding=UTF-8
похоже, не имеет значения.Я все еще не мог написать международный текст в БД, получая ту же ошибку, что и выше
Теперь, используя это как конвертировать весь mysql-database-characterset-and-collation-to-utf-8
Обновите всю свою базу данных для использования
utf8mb4
Запустите этот запрос, который дает вам то, что нужно позвонить
Скопировать вставить вывод в редакторе заменить все | с ничего не отправлять обратно в MySQL при подключении к правильной БД.
Это все, что нужно было сделать, и, похоже, все работает для меня. Не -
Dfile.encoding=UTF-8
не включен, и, кажется, работает как ожидалосьE2A Все еще есть проблема? Я, конечно, нахожусь в производстве, поэтому оказывается, что вам нужно проверить, что было сделано выше, так как это иногда не работает, вот причина и исправление в этом сценарии:
Вы можете видеть, что некоторые все еще латиноамериканцы пытаются вручную обновить запись:
Итак, давайте сузим это:
Короче говоря, мне пришлось уменьшить размер этого поля, чтобы обновление работало.
Теперь, когда я бегу:
Все работает
источник
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;
достаточно странно, когда я запускал этот последний раз, во всех полях больше не было определенного набора символов. поэтому пароль сверху сталpassword
varchar (255) NOT NULL, (ничего о кодировке). Это означает, что последняя команда просто должна была выполнить поиск mysql, каково было фактическое определение таблицы, и потому что теперь таблица была по умолчанию, это поля больше не нужны - я предполагаю, что они остались с набором символов просто потому, что во время дампа обновлений всей таблицы он не мог обновить его и, следовательно, он был оставлен в таком состоянииВ моем случае все перепробовал выше, ничего не получалось. Я уверен, моя база данных выглядит так, как показано ниже.
Итак, я смотрю столбец charset в каждой таблице
Оказывается, столбец charset является латинским. Вот почему я не могу вставить китайский в базу данных.
Это может помочь вам. :)
источник
У меня была такая же проблема в моем проекте рельсов:
Решение 1: перед сохранением в db преобразуйте строку в base64
Base64.encode64(subject)
и после выборки из db используйтеBase64.decode64(subject)
Решение 2:
Шаг 1: Измените набор символов (и параметры сортировки) для столбца темы на
Шаг 2: В файле database.yml используйте
источник
просто сделать
источник
Предполагая, что вы используете phpmyadmin для решения этой ошибки, выполните следующие действия:
latin1_swedish_ci
(или как оно там) наutf8_general_ci
источник
В основном это связано с некоторыми символами Юникода. В моем случае это был символ валюты рупии.
Чтобы быстро это исправить, я должен был определить персонажа, вызывающего эту ошибку. Я скопировал, вставил весь текст в текстовый редактор, такой как vi, и заменил тревожный символ на текстовый.
источник
У меня была эта проблема с моим приложением PLAY Java. Это моя трассировка стека для этого исключения:
Я пытался сохранить запись с помощью io.Ebean. Я исправил это, заново создав свою базу данных с сопоставлением utf8mb4, и применил эволюцию воспроизведения, чтобы заново создать все таблицы, чтобы все таблицы были воссозданы с сопоставлением utf-8.
источник
Если вы хотите применить изменение только для одного поля, вы можете попробовать сериализовать поле
источник
Если вы создаете новую таблицу MySQL, вы можете указать кодировку всех столбцов при создании, и это решило проблему для меня.
Вы можете прочитать более подробную информацию: https://dev.mysql.com/doc/refman/8.0/en/charset-column.html
источник
это не рекомендательное решение. Но стоит поделиться. Так как мой проект - это обновление СУБД от старого Mysql до новейшего (8). Но я не могу изменить структуру таблицы, только конфиг СУБД (mysql). Решение для сервера MySQL.
тест на Windows MySQL 8.0.15 на MySQL конфигурации поиска
раскомментируйте это. Или в моем случае просто введите / добавить
почему не рекомендуется решение. потому что если вы используете latin1 (мой случай) .. данные вставляются успешно, но не содержимое (mysql не отвечает с ошибкой !!). например, вы вводите информацию, как это
это сохранить
хорошо .. для моей проблемы .. я могу изменить поле на UTF8 .. Но есть небольшая проблема .. см. выше, ответ о другом решении не удался, потому что слово не вставлено, потому что содержит больше чем 2 байта (cmiiw) .. это Решение сделать ваши данные вставки в поле. Разумно использовать blob .. и вы можете пропустить мой ответ.
Еще одно тестирование было связано с использованием utf8_encode в вашем коде перед сохранением. Я использую на latin1, и это был успех (я не использую sql-mode )! ответ выше, используя base64_encode .
Я предложил анализировать ваши требования к таблице и пытался перейти с другого формата на UTF8
источник
мое решение - изменить тип столбца с varchar (255) на blob
источник
Вам нужно установить utf8mb4 в мета-html, а также на вашем сервере изменить таблицу и установить параметры сортировки в utf8mb4
источник
Подсказка: в AWS RDS вам нужна новая группа параметров для вашей БД MySQL с параметрами (вместо редактирования my.cnf)
Примечание: символьная_система остается "utf8"
Эти команды SQL НЕ РАБОТАЮТ ПОСТОЯННО - только в сеансе:
источник
Мне также пришлось удалить и заново создать все хранимые процедуры базы данных (и функции тоже), чтобы они выполнялись в новом наборе символов utf8mb4.
Бегать:
… Чтобы увидеть, какие процедуры не были обновлены до новых значений сервера character_set_client, collation_connection и Database Collation.
источник