查找数据库中所有包含%latin1%值的列。

3

我怎样才能进行这个SQL查询?

数据库名称:database_1
列名:Collation
值:latin1_swedish_ci

我需要列出所有“database_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

1
根据语法,我添加了mysql标签。你应该用你正在使用的数据库打标签。 - Gordon Linoff
2个回答

4
您可以从information_schema.columns表中查询此信息:
SELECT table_name, column_name
FROM   information_schema.columns
WHERE  collation_name LIKE '%latin1%'

注意:此答案中有几个未解决的问题。 - Rick James

1
首先,确定您将如何进行字符集转换。如果表格已经正确编码为latin1,则这是所需的转换:
 ALTER TABLE tbl CONVERT TO CHARACTER SET utf8;

如果您在latin1列中存储了utf8字节,则“修复”的方法更加复杂

然而,这会改变表中所有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命令行工具中。
如果您只需要更改单个列,则修复过程会很困难,因为必须重复每个列的其余属性。这在查询中并不容易实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接