MySQL 的 information_schema 數據庫中包含了大量的元數據,通過這些數據可以方便的獲取表和字段的信息,通過組合這些信息可以生成操作表和字段的 SQL。
本文只是爲了方便自己的記錄。
由於發現系統多個數據庫使用的字符集和排序方式有誤,因此要修改錯誤的這部分表,由於修改表無法直接影響 char, varchar, text 等字符串類型的值,因此這部分字段還需要特殊修改。又因爲數據庫開啓了主從複製,因此生成的 SQL 必須是 use 數據庫
形式,不能使用 數據庫.表名
形式。
修改庫
select concat('ALTER database `', SCHEMA_NAME, '` '
, 'DEFAULT CHARACTER SET=utf8 default COLLATE=utf8_general_ci;')
from SCHEMATA
where SCHEMA_NAME not in (
'information_schema',
'mysql',
'sys',
'performance_schema'
)
and DEFAULT_COLLATION_NAME != 'utf8_general_ci';
生成的 SQL 示例:
ALTER database `oa_wbs` DEFAULT CHARACTER SET=utf8 default COLLATE=utf8_general_ci;
修改表
SELECT concat('use `', TABLE_SCHEMA, '` ;',
'ALTER TABLE `', table_name, '` ',
'DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci;')
FROM `TABLES`
-- 排除系統表
where TABLE_SCHEMA not in (
'information_schema',
'mysql',
'sys',
'performance_schema'
)
and
TABLE_COLLATION != 'utf8_general_ci';
生成的 SQL 示例:
use `test` ;ALTER TABLE `author` DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci;
use `test` ;ALTER TABLE `city` DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci;
use `test` ;ALTER TABLE `country_i` DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci;
修改字段
SELECT concat('use `', TABLE_SCHEMA, '`; ',
' ALTER TABLE `', TABLE_NAME,
'` MODIFY COLUMN `', COLUMN_NAME, '` ' ,
DATA_TYPE ,
-- varchar, char, 其他不需要指定長度
if(data_type like '%text', ' ',
concat('(', CHARACTER_MAXIMUM_LENGTH, ') ')),
' CHARACTER SET utf8 COLLATE utf8_general_ci ',
if(IS_NULLABLE = 'YES', 'NULL DEFAULT NULL', 'NOT NULL') ,
' COMMENT ''', COLUMN_COMMENT, ''';') sqlstr
FROM `COLUMNS`
-- 排除系統表
where TABLE_SCHEMA not in (
'information_schema',
'mysql',
'sys',
'performance_schema'
)
-- 排除視圖
and not exists (
select 1 from tables
where tables.table_type = 'VIEW' and tables.table_name = columns.table_name)
-- 所有不是 utf8 的表
and (CHARACTER_SET_NAME != 'utf8' or COLLATION_NAME != 'utf8_general_ci');
生成的 SQL 示例:
use `datasync`; ALTER TABLE `sync_record_detail` MODIFY COLUMN `RESOURCE_FORM_VALUE` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '資源配置';
use `datasync`; ALTER TABLE `sync_resource_config` MODIFY COLUMN `FORM_TEMPLATE` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '表單';
use `datasync`; ALTER TABLE `sync_resource_config` MODIFY COLUMN `FORM_DEFAULT_VALUE` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '表單默認值';
use `files`; ALTER TABLE `sys_file` MODIFY COLUMN `md5` char(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 'md5';
選取一個格式化:
use `files`;
ALTER TABLE `sys_file`
MODIFY COLUMN `md5` char(32)
CHARACTER SET utf8 COLLATE utf8_general_ci
NULL DEFAULT NULL COMMENT 'md5';