Mysql2::Error: Неверное строковое значение Rails 3 UTF8

У меня есть приложение, которое работает с большим количеством данных на других языках (названия веб-страниц и метаописания). Недавно я переключился с MySQL на Percona и нашел все ошибки, которые MySQL, казалось, молчал.

Единственное, что мне не удалось исправить, это

ActiveRecord::StatementInvalid: Mysql2::Error: Incorrect string value: 

Я просмотрел текущие вопросы и ответы, но все они предполагают известную кодировку для преобразования в UTF8, я не знаю кодировку.

Что я хотел бы сделать, так это заставить рельсы преобразовать его в UTF8 (я пробовал force_encoding, но это не сработало), или я хотел бы проверить, является ли это UTF8, и если не избавиться от него.


person Dom Hodgson    schedule 26.12.2012    source источник


Ответы (2)


Я столкнулся с этой проблемой при попытке вставить эмодзи unicode в базу данных mysql... Вы можете подумать, что с utf8 вы в безопасности, но это не так. Emoji использует 4 байта, а utf8 использует только 3 байта. Решение состоит в том, чтобы использовать кодировку и сопоставление utf8mb4.

Вы можете сделать это, сначала обновив файл database.yml, который выглядит так:

development:
  adapter: mysql2
  database: my_database
  username: a_user
  password: the_password
  encoding: utf8mb4
  collation: utf8mb4_unicode_ci

Если у вас есть существующая база данных, вам нужно запустить этот sql:

ALTER TABLE `[table]` 
  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,
MODIFY [column] VARCHAR(250)
    CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

Если вы еще не выпущены в производство, вы можете просто сделать

bundle exec rake db:drop db:create db:migrate

Бесстыдно взято у Джейсона Сейфера

person Intentss    schedule 01.02.2015

Недавно я столкнулся с этой проблемой. По сути, тип сопоставления по умолчанию mysql не является utf8_unicode_ci.

Сделайте следующее. Сделайте резервную копию ваших данных, если вам нужно. Мне пришлось удалить базу данных и создать ее заново.

rake db:drop
rake db:create

Измените сопоставление базы данных mysql на utf8_unicode_ci (здесь может пригодиться phpMyAdmin). Наконец, восстановите миграцию.

rake db:migrate

Наслаждаться.

person anbiniyar    schedule 05.06.2013