Проблемы UTF8 MySQL в Rails - проблемы с кодировкой с utf8_general_ci

У меня есть сайт Rails, который работает на MySQL 5.0.32-Debian.

На этом конкретном сайте все мои таблицы используют utf8 / utf8_general_ci encoding.

Внутри этой базы данных у меня есть некоторые данные, которые выглядят так:

mysql> select * from currency_types limit 1,10;
+------+-----------------+---------+
| code | name            | symbol  |
+------+-----------------+---------+
| CAD  | Canadian Dollar | $       |
| CNY  | Chinese Yuan    | å…ƒ     |
| EUR  | Euro            | €     |
| GBP  | Pound           | £      |
| INR  | Indian Rupees   | ₨     |
| JPY  | Yen             | ¥      |
| MXN  | Mexican Peso    | $       |
| USD  | US Dollar       | $       |
| PHP  | Philippine Peso | ₱     |
| DKK  | Denmark Kroner  | kr      |
+------+-----------------+---------+

Здесь проблема, с которой я сталкиваюсь

При постановке (с сайтом db и Rails, запущенным в блоке debian) символы символов отображаются корректно, когда отображаются в Rails. Например, китайский юань появляется как 元 в моем браузере, а не å... ƒ, поскольку он отображается внутри базы данных.

Когда я загружаю эти данные на свою локальную машину разработки OS X и локально запускаю db и Rails, я вижу представление изнутри БД (å... ƒ) в моем браузере, а не в качестве символа 元, как я вижу в постановке.

Отладка, которую я выполнил

Я гарантировал, что все заголовки Content-Type возвращаются как utf8 с каждого веб-сервера (локального, промежуточного).

Мой локальный сервер mysql и промежуточный сервер настроены на использование utf8 в качестве кодировки по умолчанию. Я использую "set names" utf8 "перед тем, как делать какие-либо вызовы.

Я даже могу подключиться к моему промежуточному db из моего хоста OS X Rails, и я все еще вижу символы å... ƒ, представляющие юань. Я предполагаю, что, возможно, проблема с моим локальным клиентом mysql, но я не могу понять, в чем проблема.

Возможно, это может дать ключ

Чтобы сделать его еще более запутанным, если я вставляю символ 元 в db на свой локальный компьютер, я вижу, что в веб-браузере отлично. --- YET, если я вставляю тот же самый символ в свою промежуточную db, я получаю? отметьте в нем место на странице с моего сайта Rails.

Кроме того, локально на моей машине OS X rails, если я использую "set names" latin1 '"перед моими запросами, все символы возвращаются должным образом. У меня эти таблицы были установлены как latin1 раньше - может это проблема?

Кто-то, пожалуйста, помогите мне здесь, я схожу с ума, пытаясь понять, что случилось!

Ответ 1

AHA! Кажется, у меня была некоторая таблица информации, закодированная в latin1 раньше, и глупо изменила базы данных на utf8 без преобразования.

Запуск следующей фиксированной таблицы currency_types:

mysqldump -u root -p --opt --default-character-set=latin1 --skip-set-charset  DBNAME > DBNAME.sql

mysql -u root -p --default-character-set=utf8  DBNAME < DBNAME.sql

Теперь я просто должен убедиться, что другой контент, созданный после переключения latin1 > utf8, не перепутался с этим: (

Ответ 2

У вас есть эти две строки в database.yml в соответствующем разделе?

encoding: utf8
collation: utf8_general_ci

Ответ 3

  • Возможно, проблема заключалась в том, что у вас клиент MySQL в стадии разработки он не поддерживает UTF-8.
  • Возможно, локальная конфигурация рубиновой установки OSX не указала правильные конфигурации. У вас должна быть "encoding: utf8" в "config/database.yml" для базы данных MySQL. Вы должны иметь "$ KCODE = 'u" в "config/environment.rb" для среды ruby.

Ответ 4

Еще один простой подход - установить тип кодирования с помощью инструкции SQL Alter. Вы можете сделать это, используя ниже bash script.

for t in $(mysql --user=root --password=admin  --database=DBNAME -e "show tables";);do echo "Altering" $t;mysql --user=root --password=admin --database=DBNAME -e "ALTER TABLE $t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;";done

prettified

  for t in $(mysql --user=root --password=admin  --database=DBNAME -e "show tables";);
    do 
       echo "Altering" $t;
       mysql --user=root --password=admin --database=DBNAME -e "ALTER TABLE $t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;";
    done

Ответ 5

Моя БД уже была установлена ​​по умолчанию для utf8, но я столкнулся с той же проблемой.

Также после добавления следующего обычного метатега проблема все еще была:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Затем я создал выделенный connection.php, чтобы вся связь с MySQL была установлена ​​в charset utf8. Обратите внимание, что в utf8 в mysqli_set_charset($bd, 'utf8') нет -!

Вот мой connection.php:

<?php
    $mysql_hostname = "localhost";
    $mysql_user = "username";
    $mysql_password = "password";
    $mysql_database = "dbname";
    $prefix = "";
    $bd = mysqli_connect($mysql_hostname, $mysql_user, $mysql_password) or die("Could not connect database");
    mysqli_select_db($bd, $mysql_database) or die("Could not select database");
    if(!mysqli_set_charset($bd, 'utf8'))  {
        exit() ;
    }
?>

Другой файл php:

<?php
    //Include database connection details
    require_once('connection.php');

    //Enter code here...

    //Create query
    $qry = "SELECT * FROM subject";
    $result = mysqli_query($bd, $qry);
?>

//Other stuff

Ответ 6

Для Rails выполните следующий фрагмент кода в консоли rails. Он будет генерировать sql для всех таблиц. Затем войдите в mysql и выполните скопированный sql из консоли rails. Он изменит всю кодировку таблиц.

schema = File.open('db/schema.rb', 'r').read
rows = schema.split("\n")

table_name = nil
rows.each do |row|
  if row =~ /create_table/
     table_name = row.match(/create_table "(.+)"/)[1]
     puts "ALTER TABLE `#{table_name}` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;"
  end
end

Ответ 7

Вы можете создать миграцию, путь Rails, чтобы изменить тип сортировки в ваших базах данных:

rails generate migration ChangeDatabaseCollation

Затем вы можете отредактировать сгенерированный файл и вставить:

def change
  # for each table that will store the new collation execute:
  execute "ALTER TABLE my_table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci"
end

И запустите миграцию:

rake db:migrate

Вы также можете применить новую настройку в своей базе данных database.yml:

development:
  adapter: mysql2
  encoding: utf8
  collation: utf8_general_ci

Дополнительные сведения о миграции Rails:

http://edgeguides.rubyonrails.org/active_record_migrations.html

Дополнительные сведения о типах сортировки:

http://collation-charts.org/