MariaDB数据库COLLATE变更查询

MariaDB database COLLATE change query

我有 3 个查询要更改 COLLATION。他们应该工作,但他们没有。看起来只有第二个查询的 [!varchar] 列受到影响。谁能说出那里的问题是什么?我需要从 utf8_general_ci 转换为 utf8_bin。 我得到的结果如下:

ALTER TABLE AO_21F425_MESSAGE_MAPPING_AO MODIFY MESSAGE_ID varchar CHARACTER SET UTF8 COLLATE utf8_bin NOT NULL;
ALTER TABLE AO_21F425_MESSAGE_MAPPING_AO MODIFY USER_HASH varchar CHARACTER SET UTF8 COLLATE utf8_bin NOT NULL;
ALTER TABLE AO_38321B_CUSTOM_CONTENT_LINK MODIFY LINK_URL varchar CHARACTER SET UTF8 COLLATE utf8_bin;

依此类推...但数据库没有变化。

1) 更改类型为 VARCHAR 的列

SELECT CONCAT('ALTER TABLE `', table_name,
        '` MODIFY `', column_name, '` ', DATA_TYPE, '(', CHARACTER_MAXIMUM_LENGTH, 
        ') CHARACTER SET UTF8 COLLATE utf8_bin',
        (CASE WHEN IS_NULLABLE = 'NO' THEN ' NOT NULL' ELSE '' END), ';')
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA = 'my_database_name'
AND DATA_TYPE = 'varchar'
AND
(
    CHARACTER_SET_NAME != 'utf8'
    OR
    COLLATION_NAME != 'utf8_bin'
);

2) 更改非 VARCHAR 类型的列

SELECT CONCAT('ALTER TABLE `', table_name,
    '` MODIFY `', column_name, '` ', DATA_TYPE,
    ' CHARACTER SET UTF8 COLLATE utf8_bin',
    (CASE WHEN IS_NULLABLE = 'NO' THEN ' NOT NULL' ELSE '' END), ';')
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA = 'my_database_name'
AND DATA_TYPE != 'varchar'
AND
(
    CHARACTER_SET_NAME != 'utf8'
    OR
    COLLATION_NAME != 'utf8_bin'
);

3) 更改 table 级别

SELECT CONCAT('ALTER TABLE ',  table_name, ' CHARACTER SET utf8 COLLATE utf8_bin;')
FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
WHERE C.collation_name = T.table_collation
AND T.table_schema = 'my_database_name'
AND
(
    C.CHARACTER_SET_NAME != 'utf8'
    OR
    C.COLLATION_NAME != 'utf8_bin'
);

当心; ALTER 可能不是你想要的!

您来自 charset latin1 并且数据现在正确编码为 latin1?那么你需要ALTER TABLE ... CONVERT TO ...

您来自 latin1,但字节是 utf8?那么你需要两个 alters.

你的具体情况是什么?

确定您真正需要的内容后,请提供结果ALTERs供我们评判。

这些链接可能有帮助:

更多

ALTER  TABLE AO_21F425_MESSAGE_MAPPING_AO MODIFY MESSAGE_ID
      varchar CHARACTER SET UTF8 COLLATE utf8_bin NOT NULL;

您必须指定 varchar 的大小。

我找到了解决问题的方法。它做得很好。只需粘贴到控制台即可。

DB="your_database_name"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_bin;'; mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;' ) | mysql "$DB"