2017-04-17 61 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'列表,然后需要运行。 –