Как исправить ошибки "неверное строковое значение"?
заметив, что приложение имеет тенденцию отбрасывать случайные электронные письма из-за неправильных ошибок строкового значения, я пошел, хотя и переключил многие текстовые столбцы, чтобы использовать utf8 кодировка столбца и сопоставление столбцов по умолчанию (utf8_general_ci), чтобы он их принял. Это исправило большинство ошибок и заставило приложение перестать получать ошибки sql, когда оно попадало в нелатинские электронные письма.
несмотря на это, некоторые из писем по-прежнему вызывают программу, чтобы ударить неправильные строковые значения errrors: (Incorrect string value: 'xE4xC5xCCxC9xD3xD8...' for column 'contents' at row 1)
столбец содержание-это MEDIUMTEXT datatybe, который использует utf8 кодировка столбца и utf8_general_ci разобрать колонку. В этом столбце нет флагов, которые я могу переключать.
имея в виду, что я не хочу трогать или даже смотреть на исходный код приложения, если это абсолютно необходимо:
- что вызывает эту ошибку? (да, я знаю, что электронные письма полны случайного мусора, но я думал, что utf8 будет довольно разрешительный)
- как я могу это исправить?
- каковы вероятные последствия такого исправления?
одна вещь, которую я рассматривал, переключалась на utf8 varchar([некоторое большое число]) с включенным двоичным флагом, но я довольно незнаком с MySQL и понятия не имею, имеет ли смысл такое исправление.
19 ответов:
"\xE4\xC5\xCC\xC9\xD3\xD8"недопустимый UTF-8. Протестировано с помощью Python:>>> "\xE4\xC5\xCC\xC9\xD3\xD8".decode("utf-8") ... UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-2: invalid dataЕсли вы ищете способ избежать ошибок декодирования в базе данных, кодировка cp1252 (aka "Windows-1252" aka "Windows Western European") является самой разрешительной кодировкой - каждое значение байта является допустимой кодовой точкой.
конечно, он больше не будет понимать подлинную UTF-8, ни любую другую кодировку, отличную от cp1252, но похоже, что вас это не слишком беспокоит?
Я бы не предложил Richies ответить, потому что вы завинчиваете данные внутри базы данных. Вы не исправили бы свою проблему, но попытались бы "скрыть" ее и не смогли бы выполнять основные операции с базой данных с удаленными данными.
Если вы столкнулись с этой ошибкой, либо данные, которые вы отправляете, не закодированы UTF-8, либо ваше соединение не является UTF-8. Во-первых, убедитесь, что источник данных (файл, ...)действительно это UTF-8.
затем проверьте свою базу данных соединения, вы должны сделать это после подключения:
SET NAMES 'utf8'; SET CHARACTER SET utf8;затем убедитесь, что таблицы, в которых хранятся данные, имеют набор символов utf8:
SELECT `tables`.`TABLE_NAME`, `collations`.`character_set_name` FROM `information_schema`.`TABLES` AS `tables`, `information_schema`.`COLLATION_CHARACTER_SET_APPLICABILITY` AS `collations` WHERE `tables`.`table_schema` = DATABASE() AND `collations`.`collation_name` = `tables`.`table_collation` ;последние, проверьте настройки базы данных:
mysql> show variables like '%colla%'; mysql> show variables like '%charac%';Если источник, транспорт и пункт назначения UTF-8, ваша проблема ушла;)
типы utf-8 MySQL на самом деле не являются правильными utf-8 – он использует только до трех байтов на символ и поддерживает только базовую многоязычную плоскость (т. е. без эмодзи, без астрального плана и т. д.).
Если вам нужно хранить значения из более высоких плоскостей Юникода, вам нужно кодировка utf8.
таблица и поля имеют неправильную кодировку; однако вы можете преобразовать их в UTF-8.
ALTER TABLE logtest CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ALTER TABLE logtest DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; ALTER TABLE logtest CHANGE title title VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci;
Я решил эту проблему сегодня, изменив столбец на тип "LONGBLOB", который хранит необработанные байты вместо символов UTF-8.
единственным недостатком этого является то, что вы должны заботиться о Кодирование себе. Если один клиент вашего приложения использует кодировку UTF-8, а другой использует CP1252, вы можете отправить свои электронные письма с неверными символами. Чтобы избежать этого, всегда используйте одну и ту же кодировку (например, UTF-8) во всех ваших приложения.
см. эту страницу http://dev.mysql.com/doc/refman/5.0/en/blob.html для получения более подробной информации о различиях между TEXT/LONGTEXT и BLOB / LONGBLOB. Есть также много других аргументов в интернете, обсуждающих эти два.
В общем случае это происходит, когда вы вставляете строки в столбцы с несовместимой кодировкой / сортировкой.
Я получил эту ошибку, когда у меня были триггеры, которые по какой-то причине наследуют параметры сортировки сервера. И значение по умолчанию mysql (по крайней мере, на Ubuntu) latin-1 со шведскими параметрами сортировки. Несмотря на то, что у меня была база данных и все таблицы, установленные в UTF-8, мне еще нужно было установить
my.cnf:/ etc / mysql / my.cnf:
[mysqld] character-set-server=utf8 default-character-set=utf8и это должно перечислить все триггеры с utf8 -*:
select TRIGGER_SCHEMA, TRIGGER_NAME, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, DATABASE_COLLATION from information_schema.TRIGGERSи некоторые из переменных, перечисленных этим, также должны иметь utf-8 - * (без латинского-1 или другой кодировки):
show variables like 'char%';
сначала проверьте, является ли ваш default_character_set_name utf8.
SELECT default_character_set_name FROM information_schema.SCHEMATA S WHERE schema_name = "DBNAME";Если результат не utf8, вы должны преобразовать свою базу данных. Сначала вы должны сохранить дамп.
изменить кодировку на UTF-8 для всех таблиц в указанной базе данных, введите следующую команду в командной строке. Замените DBNAME именем базы данных:
mysql --database=DBNAME -B -N -e "SHOW TABLES" | awk '{print "SET foreign_key_checks = 0; ALTER TABLE", , "CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; SET foreign_key_checks = 1; "}' | mysql --database=DBNAMEизменить кодировку на UTF-8 для самой базы данных, введите следующую команда на mysql> подсказка. Замените DBNAME именем базы данных:
ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;Теперь вы можете повторить попытку записать символ utf8 в свою базу данных. Это решение помогает мне, когда я пытаюсь загрузить 200000 строк csv-файла в мою базу данных.
эта ошибка означает, что либо у вас есть строка с неправильной кодировкой (например, вы пытаетесь ввести кодированную строку ISO-8859-1 в кодированный столбец UTF-8), либо столбец не поддерживает данные, которые вы пытаетесь ввести.
на практике последняя проблема вызвана реализацией MySQL UTF-8, которая поддерживает только символы UNICODE, которым нужно 1-3 байта, когда они представлены в UTF-8. Смотрите "неверное строковое значение" при попытке вставить UTF-8 в MySQL через JDBC? относительно деталей.
хотя ваши параметры сортировки установлены в utf8_general_ci, я подозреваю, что кодировка символов базы данных, таблицы или даже столбца может отличаться.
ALTER TABLE tabale_name MODIFY COLUMN column_name VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
я получил аналогичную ошибку (
Incorrect string value: '\xD0\xBE\xDO\xB2. ...' for 'content' at row 1). Я попытался изменить набор символов столбца наutf8и после этого ошибка изменилась на'Data too long for column 'content' at row 1'.
Оказалось, что MySQL показывает мне ошибки. Я вернул набор символов столбца вutf8и изменил тип столбца наMEDIUMTEXT. После этого ошибка исчезла.
Надеюсь, это кому-то поможет.
Кстати MariaDB в том же случае (я проверил ту же вставку там) просто вырезать текст без ошибок.
Я пробовал все вышеперечисленные решения (которые все приносят действительные точки), но ничего не работало для меня.
пока я не обнаружил, что мои сопоставления полей таблицы MySQL в C# использовали неправильный тип: MySqlDbType.Blob . Я изменил его на MySqlDbType.Текст и теперь я могу написать все символы UTF8, которые я хочу!
p. s.мое поле таблицы MySQL имеет тип "LongText". Однако, когда я автоматически генерировал сопоставления полей с помощью программного обеспечения MyGeneration, он автоматически устанавливает тип поля как MySqlDbType.Blob в C#.
интересно, что я использую MySqlDbType.Тип Blob с символами UTF8 в течение многих месяцев без проблем, пока однажды я не попытался написать строку с некоторыми конкретными символами в ней.
надеюсь, что это помогает кто-то, кто изо всех сил пытается найти причину ошибки.
решение для меня при запуске этого неправильного строкового значения: '\xF8 ' для ошибки столбца с помощью scriptcase должно было быть уверено, что моя база данных настроена для utf8 general ci, а также мои параметры сортировки полей. Затем, когда я делаю импорт данных csv-файла, я загружаю csv в UE Studio, а затем сохраняю его в формате utf8 и вуаля! Он работает как шарм, 29000 записей там нет ошибок. Ранее я пытался импортировать excel, созданный csv.
Я добавил двоичный перед именем столбца и решить ошибку набора символов.
вставить в таблицу значения (двоичный stringcolname1);
Привет я также получил эту ошибку, когда я использую свои онлайн-базы данных с сервера godaddy я думаю, что он имеет версию mysql 5.1 или более. но когда я делаю с моего сервера localhost (версия 5.7) это было прекрасно после этого я создал таблицу с локального сервера и скопировал на онлайн-сервер с помощью mysql yog я думаю, что проблема с набором символов
в моем случае ,сначала я встретил a'???"на моем веб-сайте я проверяю набор символов Mysql, который теперь латинский ,поэтому я меняю его на utf-8,затем я перезапускаю свой проект ,затем я получил ту же ошибку с вами , затем я обнаружил, что забыл изменить кодировку базы данных и перейти на utf-8,бум, это сработало.
чтобы исправить эту ошибку, я обновил свою базу данных MySQL до utf8, которая поддерживает полный набор символов Unicode, следуя этот подробный учебник. Я предлагаю внимательно изучить его, потому что есть довольно много gotchas (например, ключи индекса могут стать слишком большими из-за новых кодировок, после которых вам нужно изменить типы полей).
здесь есть хорошие ответы. Я просто добавляю свой, так как я столкнулся с той же ошибкой, но это оказалось совершенно другой проблемой. (Возможно, на поверхности та же самая, но другая первопричина.)
для меня ошибка произошла для следующего поля:
@Column(nullable = false, columnDefinition = "VARCHAR(255)") private URI consulUri;это в конечном итоге хранится в базе данных в виде двоичной сериализации
URIкласса. Это не вызвало никаких флагов при модульном тестировании (с использованием H2) или тестировании CI/integration (с использованием MariaDB4j), он взорвался в нашей производственной установке. (Хотя, как только проблема была понята, было достаточно легко увидеть неправильное значение в экземпляре MariaDB4j; он просто не взорвал тест.) Решение состояло в том, чтобы построить пользовательский тип mapper:package redacted; import javax.persistence.AttributeConverter; import java.net.URI; import java.net.URISyntaxException; import static java.lang.String.format; public class UriConverter implements AttributeConverter<URI, String> { @Override public String convertToDatabaseColumn(URI attribute) { return attribute.toString(); } @Override public URI convertToEntityAttribute(String field) { try { return new URI(field); } catch (URISyntaxException e) { throw new RuntimeException(format("could not convert database field to URI: %s", field)); } } }использовать следующим образом:
@Column(nullable = false, columnDefinition = "VARCHAR(255)") @Convert(converter = UriConverter.class) private URI consulUri;насколько Hibernate участвует, кажется, у него есть куча при условии, тип картографы, в том числе для
java.net.URL, а неjava.net.URI(это то, что мы нужно здесь).
то ,что я сделал ,сначала изменил тип столбца на LONG BLOB ,вставил данные, а затем изменил тип столбца на VARCHAR(255), поскольку данные не были такими чувствительными, я рискнул, и это тоже было огромным( около 40k записей).Я предлагаю вам попробовать это, если только у вас нет никаких данных, которые вы не хотите искажать.
1-Вы должны объявить в своем соединении свойство enconding UTF8. http://php.net/manual/en/mysqli.set-charset.php.
2-Если вы используете mysql commando line для выполнения скрипта, вы должны использовать флаг, например:
Cmd: C:\wamp64\bin\mysql\mysql5.7.14\bin\mysql.exe -h localhost -u root -P 3306 --default-character-set=utf8 omega_empresa_parametros_336 < C:\wamp64\www\PontoEletronico\PE10002Corporacao\BancoDeDadosModelo\omega_empresa_parametros.sql
Comments