Rails, MySQL, данные Unicode и таблицы latin1 - Куда идти дальше?

Я не уверен на 100% в деталях , так что мне бы хотелось, чтобы кто-нибудь поправил меня, но я буду продвигаться вперед в том, что, как мне кажется, происходит ...

Когда я впервые настраивал свою базу данных, я использовал кодировку символов по умолчанию системы, даже не задумываясь, и это было latin1. Про i18n / l10n даже не думал. Мне это просто не пришло в голову. Я просто принял значения по умолчанию и пошел с ними.

В любом случае, я использовал базу данных исключительно для приложения Rails, и теперь у нас есть несколько ГБ данных, 100 000 строк и много международных пользователей. Я заметил, что многие из наших иностранных пользователей вставляют данные, которые кажутся Unicode / non-latin1. Вот пример:

А как насчет сумасшедшего юникода? ☢ ☠ ☭

database.yml

Вот наш файл database.yml.

development:
  adapter: mysql
  database: XXX
  username: YYY
  password: ZZZ
  host: localhost
  encoding: utf8

Как видите, мы устанавливаем кодировку символов в utf8. Однако все наши таблицы имеют набор символов по умолчанию latin1. Я уверен в этом.

Обновление После внимательного изучения наш рабочий файл database.yml не указывает кодировку, в то время как моя локальная копия указывала utf8. Это вызывало проблемы, когда я сбрасывал производственную базу данных и импортировал ее локально. Кажется, теперь импорт работает нормально, но Rails читал его неправильно.

mysql CLI tool

Когда я просматриваю данные через mysql CLI, он правильно отображает все символы Unicode. Однако оператор show create table ясно показывает, что таблицы имеют кодировку latin1 по умолчанию. Это заставляет меня думать, что MySQL каким-то образом достаточно умен, чтобы хранить данные, отличные от латинских 1.

HTTP-заголовок

Наш заголовок HTTP Content-Type установлен на utf-8, например:

Content-Type: text/html; charset=utf-8

Попытки преобразования

Я немного поиграл с преобразованием наших таблиц в кодировку utf-8, но безуспешно. В основном я пытался сбросить базу данных, запустить iconv для преобразования, а затем повторно импортировать с таблицами, установленными на utf-8. MySQL не имел ошибок, но все данные Unicode были искажены.

Что делать?

Я как бы застрял в том, что делать (если что-нибудь). Я твердо верю в то, что нельзя исправлять то, что не так т сломан, но меня беспокоит вся эта ситуация. У нас никогда не было жалоб от пользователей на то, что они не могут хранить свои данные, и, похоже, все работает нормально. Я просто хотел бы знать, что именно происходит, кто / что выполняет преобразование (MySQL? Ruby? Rails? MySQL-соединение?) И какие-либо советы о том, как действовать дальше.

8
задан Micah 4 October 2010 в 01:13
поделиться