UTF8 MySQL проблемы на Rails - проблемы с кодированием utf8_general_ci - PullRequest
17 голосов
/ 06 декабря 2008

У меня есть промежуточный сайт Rails, работающий на MySQL 5.0.32-Debian.

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

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

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. Например, китайский юань отображается как uan в моем браузере, а не å… ƒ, как показано в базе данных.

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

Отладка, которую я сделал

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

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

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

Возможно, это может дать подсказку

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

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

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

Ответы [ 7 ]

28 голосов
/ 06 декабря 2008

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, не испортился: (

20 голосов
/ 07 декабря 2008

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

encoding: utf8
collation: utf8_general_ci
2 голосов
/ 06 декабря 2008
  1. Возможно, проблема была в том, что ваш MySQL-клиент не поддерживает UTF-8.
  2. Ваша локальная конфигурация установки OSX ruby, возможно, не объявила правильные настройки. Вы должны иметь «encoding: utf8» в «config / database.yml» для базы данных MySQL. Вы должны иметь "$ KCODE = 'u'" в "config / environment.rb" для среды ruby.
1 голос
/ 18 апреля 2013

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

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
0 голосов
/ 27 ноября 2015

Вы можете создать миграцию, способ 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 /

0 голосов
/ 15 апреля 2015

Для 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
0 голосов
/ 07 ноября 2014

Моя БД уже была установлена ​​по умолчанию в 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
...