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
供我们评判。
这些链接可能有帮助:
- 诊断、最佳实践、常见问题:
- 修复:http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases
更多
在
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"
我有 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
供我们评判。
这些链接可能有帮助:
- 诊断、最佳实践、常见问题:
- 修复:http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases
更多
在
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"