如何执行此SQL查询?
名称数据库:database_1
列:排序规则
值:latin1_swedish_ci
我需要所有“数据库_1”表的列表,这些表的列的值包含文本%latin1%。
我的最终目标:我需要在包含该数据的所有表中更改这些值,例如:
CHARACTER SET latin1 COLLATE latin1_swedish_ci
更改为:
CHARACTER SET utf8 COLLATE utf8_unicode_ci
我已经准备好咨询更换了
ALTER TABLE `blog_sitemapconf` CHANGE `value` `value` VARCHAR(100) CHARACTER SET latin1 COLLATE latin1_english_ci NOT NULL DEFAULT '';
但是我需要获取所有包含带有
列的表的名称。CHARACTER SET latin1 COLLATE latin1_swedish_ci
答案 0 :(得分:2)
您可以从information_schema.columns
表中查询以下信息:
SELECT table_name, column_name
FROM information_schema.columns
WHERE collation_name LIKE '%latin1%'
答案 1 :(得分:0)
首先,确定如何进行字符集转换。 如果该表已在latin1中正确编码,则这是所需的转换:
ALTER TABLE tbl CONVERT TO CHARACTER SET utf8;
相反,如果您在latin1列中存储了utf8字节,则'fix'为more complex。
但是,这会更改表中的所有CHAR
/ TEXT
列。可以吗?
如果可以,那么将生成所有ALTERs
。
SELECT DISTINCT
CONCAT("ALTER TABLE ", table_schema, ".", table_name,
" CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;")
FROM information_schema.columns
WHERE character_set = 'latin1'
AND table_schema NOT IN ('mysql', 'information_schema', 'performance_schema');
然后您可以将它们复制/粘贴到mysql命令行工具中。
如果仅需要更改单个列,则修复很困难,因为必须重复每个列的其余属性。这在查询中并不容易。