【问题标题】:find all the columns of a database with %latin1% value查找具有 %latin1% 值的数据库的所有列
【发布时间】:2019-02-26 14:01:42
【问题描述】:

我该如何做这个 SQL 查询?

名称数据库:database_1
栏目:整理
值: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

【问题讨论】:

  • 根据语法,我添加了mysql标签。您应该使用您正在使用的数据库进行标记。

标签: mysql sql select collation data-dictionary


【解决方案1】:

首先,确定您将如何进行字符集转换。 如果表格在 latin1 中正确编码,那么这是所需的转换:

 ALTER TABLE tbl CONVERT TO CHARACTER SET utf8;

如果您将 utf8 字节存储在 latin1 列中,则“修复”为 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 命令行工具中。

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

【讨论】:

    【解决方案2】:

    您可以从information_schema.columns 表中查询此信息:

    SELECT table_name, column_name
    FROM   information_schema.columns
    WHERE  collation_name LIKE '%latin1%'
    

    【讨论】:

    • 警告:这个答案中没有考虑到几个松散的结局。
    猜你喜欢
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2021-11-10
    • 2021-08-06
    • 2018-06-24
    相关资源
    最近更新 更多