Как я могу обрабатывать данные, чтобы избежать ошибки неправильного строкового значения MySQL?

Я пытаюсь использовать задачу 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» в слове «Юристы».

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

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

Похоже, он задыхается от «TM» после «TRInfo».

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

В идеале было бы здорово заменить их более привлекательными символами — заменить апостроф одинарной кавычкой, а символ TM строкой «(TM)».

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


person Ethan    schedule 04.06.2009    source источник


Ответы (6)


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

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

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

person Kathy Van Stone    schedule 04.06.2009
comment
Это решение не отвечает на вопрос OP. Есть ли какой-либо метод... - person Gary; 10.06.2014

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

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

person lex82    schedule 30.04.2010

Как правило, это происходит, когда вы вставляете строки в столбцы с несовместимой кодировкой/сопоставлением.

Я получил эту ошибку, когда у меня были TRIGGER, которые по какой-то причине наследуют сопоставление сервера. И по умолчанию 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%';
person Ondra Žižka    schedule 20.07.2012

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

person Todd Gardner    schedule 04.06.2009
comment
Спасибо, все настроено на utf8. - person Ethan; 04.06.2009

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

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

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

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

person Richardhe2007    schedule 23.07.2015

У меня была такая же проблема с импортом данных из 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()

ссылка

person zwitterion    schedule 27.01.2016