Mysql2:: Ошибка: неверное строковое значение Rails 3 UTF8

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

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

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

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

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

2 ответа

Я столкнулся с этой проблемой, пытаясь вставить Unicode Emoji в базу данных 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

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

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

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

rake db:drop
rake db:create

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

rake db:migrate

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

Другие вопросы по тегам