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
Наслаждаться.