MySQL меняет UTF-8 на ASCII-8BIT - PullRequest
       9

MySQL меняет UTF-8 на ASCII-8BIT

6 голосов
/ 26 февраля 2011

У меня есть этот сценарий.

Название фильма:

$ title = "La leyenda de Osaín"

С этой кодировкой:

$ title.encoding.name
>> UTF-8

Затем я сохраняю его в базе данных.

$ movie = Movie.create!(:title => title)

Тогда я пытаюсь получить фильм.

$ Movie.find(movie.id).title.encoding.name
>> "ASCII-8BIT"

$ Movie.find(movie.id).title
>> "La leyenda de Osa\xC3\xADn"

Все другие фильмы работают без специальных символов, таких как í и û.

Это мой файл database.yaml:

development:
  adapter: mysql
  database: development
  username: linus
  password: my_password
  socket: /tmp/mysql.sock
  encoding: UTF8

Я получаю правильные данные при использовании forced_encoding.

$ Movie.find(movie.id).title.force_encoding("UTF-8")
>> "La leyenda de Osaín"

Я использую Rails 3.0.5.rc1 с MySQL 14.14.

Кто-нибудь знает, в чем может быть проблема?

Ответы [ 2 ]

9 голосов
/ 26 февраля 2011

Я нашел решение своей проблемы.Теперь я использую более новый mysql2 gem.

Я заменил gem "mysql" на gem "mysql2" внутри Gemfile.

Затем я изменил адаптер базы данных внутрифайл database.yaml.

От:

development:
  adapter: mysql
  database: development
  username: linus
  password: my_password
  socket: /tmp/mysql.sock
  encoding: UTF8

Кому:

  development:
    adapter: mysql2
    database: development
    username: linus
    password: my_password
    socket: /tmp/mysql.sock
    encoding: UTF8

Я думаю, что в моем случае это было прерыванием сделки:

Взято из Github MySQL2

[...] Это также вызывает использование UTF-8 [или двоичного] для соединения [и всехстроки в 1.9 [...]

0 голосов
/ 26 февраля 2011

Согласно этой ссылке , рельсовые леса создают столбцы varchar (255) в MySQL. В документации MySQL говорится следующее о varchar (255):

Например, столбец VARCHAR (255) может держать строку с максимальной длиной 255 символов. Предполагая, что столбец использует набор символов latin1 (один байт на символ), фактический хранение требуется длина строка (L), плюс один байт для записи длина строки.

Я предполагаю, что тип столбца в базе данных не поддерживает символы, представленные более чем одним байтом. Эта ссылка содержит дополнительную информацию о распространенных ошибках в рельсах при работе со строками Unicode и, в частности, говорит, что вам нужно создать свою базу данных как utf8, например:

CREATE_DATABASE my_web_two_zero_development DEFAULT CHARSET utf8;
...