2008-12-06 112 views
17

我有一個暫存Rails站點,它運行在MySQL 5.0.32-Debian上。utf8關於Rails的MySQL問題 - 使用utf8_general_ci編碼問題

在這個特定的網站上,我所有的表格都使用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  | 
+------+-----------------+---------+ 

下面是我在

在分期問題(用分貝和Rails網站上的Debian的運行框),從Rails顯示時,符號的字符顯示正確。例如,中國人民幣在我的瀏覽器中顯示爲元,而不是像數據庫中顯示的那樣。

當我將數據下載到本地OS X開發機器並在本地運行db和Rails時,我在瀏覽器中看到DB(ƒ...)中的表示,而不是字符元,正如我在分級中看到的那樣。

調試我已經做了

我保證爲Content-Type的所有標題都回來了從每個網絡服務器(地方,分期)UTF8。

我的本地mysql服務器和登臺服務器都設置爲使用utf8作爲默認字符集。在我撥打電話之前,我正在使用「set names'utf8'」。

我甚至可以從我的OS X Rails主機連接到我的臨時數據庫,而且我仍然可以看到代表元的字符。我在猜測,也許有我的MySQL本地客戶端的問題,但我無法弄清楚是什麼問題。

也許這可能借給線索

爲了使它更加混亂,如果我貼我的本地機器上的字符元到數據庫,我看到,在網頁瀏覽器的罰款。 ---如果我將同一個字符粘貼到我的臨時數據庫中,我會得到一個?從我的Staging Rails站點標記在它的頁面上。

另外,如果我在我的查詢之前使用「set names'latin1'」,則在本地OS X rails機器上,字符全部恢復正常。我確實把這些表格設置爲latin1之前 - 這可能是問題嗎?

有人請幫我出來,我瘋了試圖找出有什麼問題!

回答

28

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轉換之後產生的其他內容不是由:(

+0

是的,這是問題。但是當你將連接設置爲latin1時,它看起來很正常,因爲它做了相同的翻譯。 我有這個問題,但無法重新創建數據庫。所以我改變了phpMyAdmin使用latin1連接,然後導出(所以導出的數據現在是正確的),然後刪除該hack並重新導入。數據已修復。詳情請見:http://omegadelta.net/2010/11/23/when-you-thought-the-db-was-utf-8-but-it-wasnt/ – 2010-11-23 04:15:33

+0

謝謝!今天早上我正在摸索着我的腦袋,結果這是我之前創建的數據庫的解決方案! – Cymen 2011-01-14 17:38:17

+0

只接收「訪問被拒絕」消息的Windows用戶應該將** DBNAME.sql **更改爲**%homepath%\ DBNAME.sql **,以用於mysqldump和mysql調用。並感謝Subimage! – 2012-01-11 00:13:11

2
    搞砸
  1. 這個問題可能與你的MySQL客戶端不同,它不支持UTF-8
  2. 你的本地OSX ruby​​安裝配置可能沒有聲明正確的配置。 你應該在MySQL數據庫的「config/database.yml」中有「encoding:utf8」。 你應該在「config/environment.rb」中爲ruby環境設置「$ KCODE ='u'」。
19

你有你的database.yml這兩條線下最合適的部分?

encoding: utf8 
collation: utf8_general_ci 
1

另一個簡單的方法是使用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 

美化

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

我的數據庫已經默認爲utf8設置,但我遇到同樣的問題。

還增加了如下常用meta標籤後,問題仍然存在:

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

然後,我創建了一個專門的connection.php保證與MySQL的所有通信設置爲UTF-8字符集。請注意,mysqli_set_charset($bd, 'utf8')中的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 
0

對於Rails的運行下面的代碼片段軌控制檯。它將爲所有表生成一個sql。然後登錄到MySQL並從rails控制檯執行復制的sql。它會改變所有的表格編碼。

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

可以生成遷移,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/