我正在使用 mariadb 和 Spring、JdbcTemplate 进行开发。
一开始我们将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
。看起来不可能找到每个表和列。
所以我想知道立即更改这些。(包括Procedures
和Functions
)。 -- 类似于 (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
最佳答案
SELECT DISTINCT TABLE_SCHEMA, TABLE_NAME
FROM information_schema.COLUMNS
WHERE CHARACTER_SET_NAME = 'utf8'
将列出仍将某些列设置为 utf8 的所有表。当他们,做 ALTER TABLE .. CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
这应该生成您需要的所有ALTER
:
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
等。
您可以执行类似的操作来更改各个列。
您不需要同时执行这两项操作。
关于mysql - 如何一次性修改mariadb图表集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43444723/