Rails 3, mysql / mysql2 неправильно интерпретирует некоторые извлеченные строки как ASCII-8BIT - PullRequest
3 голосов
/ 26 ноября 2010

Эта проблема возникла как проблема «несовместимых кодировок символов: ASCII-8BIT и UTF-8», но это , а не , о чем я спрашиваю.Скорее, я обнаружил, что эта проблема происходит, потому что определенные поля моей базы данных помечаются как ASCII-8BIT, когда они извлекаются, в то время как большинство из них правильно отображаются как UTF-8.

Например, в таблице со столбцами country и nationality, где оба столбца в строке 16 имеют одинаковые значения (скопированы и вставлены), я получаю

irb(main):003:0> c = Country.find(16)
irb(main):004:0> puts "#{c.name}, #{c.name.encoding}, #{c.name.bytes.to_a}"
�land Islands, UTF-8, [195, 133, 108, 97, 110, 100, 32, 73, 115, 108, 97, 110, 100, 115]
irb(main):005:0> puts "#{c.nationality}, #{c.nationality.encoding}, #{c.nationality.bytes.to_a}"
�land Islands, ASCII-8BIT, [195, 133, 108, 97, 110, 100, 32, 73, 115, 108, 97, 110, 100, 115]

Аналогично, простой puts name дает �land Islands, в то время как для nationality он дает "\xC3\x85land Islands" - одни и те же байты, другое представление.

Кодировка для данного столбца представляется постоянной независимо от того, является ли строкаимеет не-ascii символы, так что это не просто проблема со строкой.То есть все значения в nationality интерпретируются как ascii, а все , как в name как UTF-8.

Проблема не ограничиваетсяодной таблицы, и я не нашел ни одного шаблона, по которому столбцы будут распознаны неправильно.

Вот параметры и среда:

  • Rails 3.0.0 в Windows 7 64-бит
  • Адаптер базы данных: mysql2 и mysql показывают одинаковое поведение
  • Database.yml включает encoding: utf8
  • application.rb включает в себя config.encoding = "utf-8"
  • MySQLбаза данных, таблица и оба столбца определены как utf8
  • Оба столбца в MySQL - это varchar, 255, допустимо пустое значение
  • Я могу воспроизвести проблему при новой установке Rails и ничего, кроме Countryопределена модель для доступа к базе данных.Я еще не пробовал использовать свежую однострочную базу данных.

Кто-нибудь знает, что здесь происходит?

Ответы [ 3 ]

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

Я нашел решение, используйте гем ruby-mysql вместо mysql или mysql2.

0 голосов
/ 26 ноября 2010

Я думаю, что у меня похожая проблема.

Когда я получаю данные из рельсов MySQL DB, преобразую строку в float:

Столбцы "Complemento" и "estado" являются строками вDB, хотя действие «show» говорит Complemento: 0.0 -> в DB «apto 191»

Эскола была успешно создана.

Ном: Silva Braga

Endereco: Rua DrArnaldo

Номер: 99

Complemento: 0.0 -> DB - это "apto 191"

Cidade: São Paulo

Estado: 0.0 -> DB is"MG"

Редактировать |Назад

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...