2014-01-25 106 views
4

我在Bluehost上使用Django。我爲用戶生成的輸入創建了一個表單,但是來自此表單的unicode輸入未能存儲或顯示字符。所以我做了一個SO和谷歌搜索,我應該改變我的數據庫的整理和字符集。我從python27 manage.py dbshell,它發起了一個mysql外殼運行該SQLALTER DATABASE更改COLLATE不起作用

ALTER DATABASE learncon_pywithyou CHARACTER SET utf8 COLLATE utf8_unicode_ci;

,是什麼在屏幕上顯示是 Query OK, 1 row affected (0.00 sec)

所以我假設問題解決了,但實際上並不是這樣。這個sql沒有做任何事情,因爲我後來在Bluehost提供的phpMyAdmin中找到它。所有表的所有Varchar字段仍然在lantin1_swedish_ci collat​​e中。

因此,假設alter table應該工作。我在MySQL alter table mytable character set utf8 collate utf8_unicode_ci;

運行此,雖然在屏幕上它顯示Query OK. 4 rows affected,它實際上什麼也沒做都不好,mytable這些領域的整理並沒有改變。

因此,我最後手動更改phpMyAdmin中的字段爲mytable,這個工程,現在我能夠在這個表中插入unicode並且它們也能正確顯示,但是我有大約20個這樣的表,我不想要手動更改它們。

我們是否有一個簡單而有效的方法來更改每個字段的Collat​​e以存儲和顯示正確的unicodes?

回答

1

除了@StuartLC, 對於更改所有20桌字符集和下面的查詢覈對使用,這世界是數據庫名稱

SELECT 
CONCAT("ALTER TABLE ",TABLE_SCHEMA , ".",TABLE_NAME," CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci") AS AlterSQL 
FROM information_schema.TABLES 
WHERE TABLE_SCHEMA = "world"; 

以上將準備您需要運行的所有ALTER查詢。

+0

感謝這個經驗豐富的答案,現在我相信那些DBMS在設計中確實考慮了自動化,即使沒有太多關鍵字。這是我想要的,它應該爲我節省很多時間。並感謝@StuartLC的有用基礎,「轉換爲」。 – TonyTony

+0

如下所示:如果表中沒有任何內容被轉換,字符集保持不變 - 在這種情況下,您必須使用不帶「convert to」的查詢。 MariaDB 10.0.27。 – korkman

4

更改數據庫級別的排序規則會設置新對象的默認值 - 現有排序規則不會更改。

同樣,在表級別,only new columns(底部見註釋)受到影響這一點:

alter table mytable character set utf8 collate utf8_unicode_ci; 

然而,現有列的排序規則轉換,你需要添加convert to

alter table mytable convert to character set utf8 collate utf8_unicode_ci; 
+3

只需在那裏放一個便條:如果表中沒有任何內容被轉換,字符集保持不變 - 在這種情況下,您必須使用沒有「轉換爲」的查詢。 – korkman

+0

@korkman - 這是我們嘗試更新數據庫的確切問題。如果不需要轉換,它將不會更新排序規則有點愚蠢。 – Origin