Проблемы 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/