2017-04-17 20 views
0

我正在用mariadb和Spring JdbcTemplate進行開發。如何修改mariadb chartset?

起初,我們製作了DB字符集作爲utf8,但現在我們必須將其更改爲utf8mb4,因爲表情符號。

到現在爲止,我用下面的查詢來更新單個字符集。

ALTER TABLE WT_WORKS CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 
ALTER TABLE WT_WORKS CHANGE WORKS_TITLE WORKS_TITLE VARCHAR(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 
ALTER TABLE WT_WORKS CHANGE WORKS_DESC WORKS_DESC VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 

但是,由於表關係,它現在是有效的。例如,當我插入到WT_WORKS時,還需要將其轉換爲WT_WRITERS。看起來不可能找到每個表和列。

所以我想知道一次改變這些(包括ProceduresFunctions)。 - 像(v_name VARCHAR(10))(v_name VARCHAR(10) CHARSET utf8mb4)

感謝您的回答。

僅供參考。我my.cnf得到遵循設置

[client] 
default-character-set=utf8mb4 

[mysqld] 
collation-server = utf8mb4_unicode_ci 
character-set-server = utf8mb4 

[client] 
default-character-set = utf8mb4 

回答

0
SELECT DISTINCT TABLE_SCHEMA, TABLE_NAME 
    FROM information_schema.COLUMNS 
    WHERE CHARACTER_SET_NAME = 'utf8' 

將列出仍然有一些列設置爲UTF-8的所有表。當他們做ALTER TABLE .. CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;

這應該生成所有ALTERs你需要:

SELECT DISTINCT 
     CONCAT(
      "ALTER TABLE ", TABLE_SCHEMA, ".", TABLE_NAME, 
      " CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;" 
      ) 
    FROM information_schema.COLUMNS 
    WHERE CHARACTER_SET_NAME = 'utf8' 

然後將其複製並粘貼到mysql命令行工具。

警告:如果你有一些字符串不是utf8,它們會被盲目地轉換爲utf8mb4。這對於十六進制,ascii等列是不好的,例如country_code,uuid,md5等等。

你可以做一些類似的改變個別列。

你不需要同時做這兩件事。

+0

它看起來像只能用一個查詢無法修復。謝謝您的好意。 –

+0

是的。一個查詢會生成許多'ALTERs'列表,然後需要運行。 –