查找具有%latin1%值的数据库的所有列

时间:2018-09-22 10:50:21

标签: mysql sql select collation data-dictionary

如何执行此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

2 个答案:

答案 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命令行工具中。

如果仅需要更改单个列,则修复很困难,因为必须重复每个列的其余属性。这在查询中并不容易。