Как я могу обработать данные, чтобы избежать ошибки MySQL «неверное значение строки»? - PullRequest
4 голосов
/ 04 июня 2009

Я пытаюсь использовать задачу Rake для переноса некоторых устаревших данных из MS Access в MySQL. Я работаю на Windows XP, используя Ruby 1.8.6.

У меня есть кодировка для Rails, установленная как "utf8" в database.yml.

Кроме того, набор символов по умолчанию для MySQL - utf8.

99% данных поступают нормально, но время от времени я получаю значение столбца, которое выдает мне ошибку примерно так:

Mysql::Error: Incorrect string value: '\x92 Comm...' for column 'name' 
  at row 1: 
  INSERT INTO `organizations` ( [...] ) 
  VALUES('Lawyers’ Committee', [...] )

Похоже, что проблема, вызывающая проблемы с MySQL, - это апостроф сразу же после "s" в слове "Lawyers".

Вот еще один ...

Mysql::Error: Incorrect string value: '\x99 aoc' for column 'department' 
  at row 1: 
  INSERT INTO `addresses` 
[...]
  'TRInfo™ aoc'
[....]

Похоже, он задыхается от "ТМ" после "TRInfo".

Есть ли какой-нибудь метод Ruby или Rails, через который я могу запустить данные, чтобы очистить от них любые символы, которые задушит MySQL?

В идеале было бы здорово заменить их на более приемлемые символы - замените апостроф одинарной кавычкой, а символ ТМ - строкой "(ТМ)".

Или, если бы я мог как-то настроить MySQL для хранения этих символов без ошибок, это тоже было бы здорово.

Ответы [ 7 ]

6 голосов
/ 04 июня 2009

Похоже, ваши входные данные не в UTF-8.

Я провел небольшое исследование, и стилизованная цитата, используемая в Lawyer, кодируется как \ x92 в кодировке Windows-1252, но это было бы бессмысленно для utf-8 (когда я декодировал и кодировал его в utf8, я получил \ xe2 \ x80 \ x99).

Таким образом, вам нужно будет преобразовать входные строки из windows-1252 в utf-8 (или в unicode).

1 голос
/ 20 июля 2012

В общем случае это происходит при вставке строк в столбцы с несовместимой кодировкой / сопоставлением.

Я получил эту ошибку, когда у меня были TRIGGER, которые по какой-то причине наследуют параметры сортировки сервера. И по умолчанию mysql (по крайней мере, в Ubuntu) латиница-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%';
1 голос
/ 30 апреля 2010

У меня была такая же проблема при помещении содержимого файлов в кодировке UTF-16 - которые обычно хранят один символ на 16-битный блок - в таблицы mysql с java. Проблема заключалась в том, что строка в кодировке UTF-16 содержала так называемые суррогатные пары . Это означает, что два последовательных 16-битных блока UTF-16 кодируют один специальный символ, но не могут быть преобразованы в соответствующую кодировку UTF-8 по отдельности. См. Википедия для дальнейшего объяснения.

Решением было просто заменить эти символы пробелами. Это диапазон символов, который вы можете удалить из своей строки: U + D800 – U + DFFF

0 голосов
/ 27 января 2016

У меня была такая же проблема при импорте данных из SQL Server в MySql с использованием Php. Мое решение было utf8_encode() при вставке в MySql и использование utf8_decode() при извлечении из MySql для отображения в браузере. Вот мой полный код, который хорошо работает.

//For string values
$Gro2=(is_null($row["GrpNm"]))?"NULL":"\"".mysql_escape_string(utf8_encode($row["GrpNm"]))."\"";


$sqlMy ="INSERT INTO `tbl_name` VALUES ($Gro2)";

Обратите внимание: для новых проектов используйте

mysqli_escape_string()

ссылка

0 голосов
/ 23 июля 2015

Добавление двоичного кода до того, как странный столбец решит проблему.

В моем случае у меня есть триггер обновления таблицы А для вставки данных в другую таблицу. В странном столбце есть некоторые специальные символы, и обновление завершилось неудачно с сообщением: «ОШИБКА 1366 (HY000): Неверное строковое значение: '\ xE7 ....'"

После того, как я много покопался, я нашел решение, добавив двоичный файл перед именем строкового столбца или используя приведение (weirdcolumn как двоичный файл);

Надеюсь, это поможет.

0 голосов
/ 25 ноября 2012
I encountered the same problem today.
After tried many times, I found out the reason and fix it at last.
For applications that store data using the default MySQL character set and collation (latin1, latin1_swedish_ci), so you need to specify the character set and collation to utf8/utf8_general_ci when your create your database or table.
e.g.:
        $sql = "CREATE TABLE " . $table_name . " (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        bookname varchar(128) NOT NULL,
        author varchar(64) NOT NULL,
        PRIMARY KEY  (id),
        KEY (bookname)
        )CHARACTER SET utf8 COLLATE utf8_general_ci;";

Reference:
《mysql create table problem? SOLVED!!!!!!!!!!!》
http://forums.mysql.com/read.php?121,193883,193883
《10.1.5. Configuring the Character Set and Collation for Applications》
http://dev.mysql.com/doc/refman/5.0/en/charset-applications.html

Hoping this can help you.
0 голосов
/ 04 июня 2009

Похоже, что ваша старая база данных имеет один строковый формат (utf8?) И ваши рельсы ожидают чего-то другого. Если вы вводите в utf8, вы пытались настроить ваши рельсы для его поддержки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...