Mysql2 :: Ошибка: неправильное строковое значение: '\ xE2\x80\xA8\x09

У меня есть приложение для рельсов. Иногда, когда пользователь пишет в текстовом поле и выполняется запрос для обновления этого поля в базе данных MySQL, я получаю этот журнал ошибок:

UPDATE boats SET описание = 'Vive la experencia única de navegar abordo de un clásico de madera de lujo como Mako. Te emocionará. ', Updated_at =' 2015-03-10 20:10:32 'WHERE boats.id = 1

    E, [2015-03-10T20:10:32.223430 #20343] ERROR -- : Mysql2::Error: Incorrect string value: '\xE2\x80\xA8\x09Te...' for column 'description' at row 1: UPDATE boats SET description = 'Vive la experiencia única de navegar abordo de un clásico de madera de lujo como Mako. 
        Te emocionará.', updated_at = '2015-03-10 20:10:32' WHERE boats.id = 1

ПРИМЕЧАНИЕ. Извините, я не могу поставить код выше как код. Должен быть особый характер.

Я бы хотел, чтобы пользователь мог добавить любого персонажа без ошибок.

У меня есть среда разработки и производства. Ошибка происходит только в процессе производства.

Я видел это сообщение, которое выглядит той же проблемой, что и моя: Mysql2 :: Ошибка: неправильное строковое значение

Я запускаю этот запрос для show variables like 'char%'; для проверки конфигурации символа базы данных и: Разработка:

'character_set_client', 'utf8'
'character_set_connection', 'utf8'
'character_set_database', 'utf8'
'character_set_filesystem', 'binary'
'character_set_results', 'utf8'
'character_set_server', 'utf8'
'character_set_system', 'utf8'
'character_sets_dir', '/usr/local/Cellar/mysql/5.6.19/share/mysql/charsets/'

Производство:

'character_set_client', 'utf8'
'character_set_connection', 'utf8'
'character_set_database', 'latin1'
'character_set_filesystem', 'binary'
'character_set_results', 'utf8'
'character_set_server', 'latin1'
'character_set_system', 'utf8'
'character_sets_dir', '/usr/share/mysql/charsets/'

Итак, я выполнил ALTER DATABASE yanpyprod CHARACTER SET utf8 COLLATE utf8_general_ci; для обновления моего набора символов базы данных до utf8.

Однако после того, как набор charecter изменился на utf8, я все равно получаю ту же ошибку.

Ответ 1

Он работает, если вы запустите ALTER TABLE your_database_name.your_table CONVERT TO CHARACTER SET utf8 вместо запроса к обновленному набору символов в базе данных выше.

Решение - это прикрепленный пост, в самом конце.

Ответ 2

Есть два способа преодолеть это

  1. Изменить набор символов по умолчанию для таблицы
  2. Изменить набор символов по умолчанию для определенного поля

Варианты 1
Как в принятом ответе:

ALTER TABLE your_database_name.your_table CONVERT TO CHARACTER SET utf8;

Вариант 2
Если вам нужно сохранить набор символов по умолчанию для таблицы, вы можете изменить определенное поле или набор полей, с которыми возникла проблема.

У меня та же проблема с двумя полями в таблице, и эти поля хранят содержимое из значений полей расширенного текста. Эти поля используются для ввода HRML, а также для некоторого содержимого, которое вызывает ошибку.

Поэтому, если проблема заключается только в поле или наборе полей, вы можете установить набор символов для этого конкретного поля, можно использовать следующий тип запроса ALTER, чтобы установить набор символов для поля.

ALTER TABLE your_db_name.table_name MODIFY COLUMN column_name text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

ПРИМЕЧАНИЕ. Обновите соответствующие имена и значения в соответствии с вашими требованиями, соответствующими окружающей среде. Здесь нужно выделить только одно: CHARACTER SET utf8

Ответ 3

Добавление опции encoding: latin1 в ActiveRecord решило эту проблему для меня.

Также я нашел этот обходной путь, который заставляет mysql рассматривать latin1 как utf-8:https://github.com/rails/rails/issues/9834#issuecomment-15210861