Как исправить ошибки "неверное строковое значение"?



заметив, что приложение имеет тенденцию отбрасывать случайные электронные письма из-за неправильных ошибок строкового значения, я пошел, хотя и переключил многие текстовые столбцы, чтобы использовать 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 и понятия не имею, имеет ли смысл такое исправление.

1299   19  

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

    Ничего не найдено.