您当前的位置: 首页 >  c#

寒冰屋

暂无认证

  • 2浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

在C#中轻松将所有MySQL数据库和表转换为utf8mb4

寒冰屋 发布时间:2022-07-26 22:56:12 ,浏览量:2

  • 源代码:  https ://github.com/adriancs2/Convert-MySQL-To-utf8mb4
介绍

本文介绍了将 所有MySQL数据库和表的默认字符转换为utf8mb4的简单解决方案(用C#编写)。

背景

utf8mb4是从MySQL 8开始的默认字符集。它对世界上所有的语言字符都有最好的支持,包括emoji字符等。因此,如果您的应用程序使用各种unicode字符,则使用utf8mb4具有最佳兼容性。当您需要一次对旧项目中的所有数据库和表执行批量转换时,本文将非常有用。

使用代码

您可以添加以下Nuget包之一:MySQL连接器以使其正常工作:

  • MySql.data (NuGet Gallery | MySql.Data 8.0.30)
  • MySqlConnector ( NuGet Gallery | MySqlConnector 2.1.11 )
  • dotConnect.Express.for.MySQL ( NuGet Gallery | dotConnect.Express.for.MySQL 9.0.0 )

这个想法基本上是获取数据库列表,然后遍历数据库并获取表。对所有表执行循环并检查它的默认字符集,如果不是utf8mb4,则将其一一转换。

首先,获取数据库列表:

SELECT * FROM information_schema.SCHEMATA;

在C#中,

using (MySqlConnection conn = new MySqlConnection(constr))
{
    using (MySqlCommand cmd = new MySqlCommand())
    {
        conn.Open();
        cmd.Connection = conn;

        DataTable dtDatabase = new DataTable();

        cmd.CommandText = "SELECT * FROM information_schema.SCHEMATA;";
        MySqlDataAdapter da1 = new MySqlDataAdapter(cmd);
        da1.Fill(dtDatabase);

        conn.Close();
    }
}

这将返回一个包含以下列详细信息的表:

  • SCHEMA_NAME
  • DEFAULT_CHARACTER_SET_NAME
  • DEFAULT_COLLATION_NAME

在这里,可以检查字符集。如果未设置为“utf8mb4”,则会对其进行修改。

但首先,需要忽略以下数据库,因为它们是MySQL只读特定信息:

  • information_schema
  • mysql
  • performance_schema
  • sys

数据库字符集转换的SQL语句:

ALTER DATABASE `{database name}` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

在C#中,

foreach (DataRow dr in dtDatabase.Rows)
{
    string database = dr["SCHEMA_NAME"] + "";

    // ignore
    switch (database)
    {
        case "information_schema":
        case "mysql":
        case "performance_schema":
        case "sys":
            continue;
    }

    string db_charset = dr["DEFAULT_CHARACTER_SET_NAME"] + "";
    string db_collation = dr["DEFAULT_COLLATION_NAME"] + "";

    if (db_charset == "utf8mb4" && db_collation == "utf8mb4_general_ci")
    {
        // do nothing
    }
    else
    {
        cmd.CommandText = $"ALTER DATABASE `{database}` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;";
        cmd.ExecuteNonQuery();
    }
}

接下来就是通过如下的SQL语句来获取表的列表:

show table status;

在C#中,

cmd.CommandText = $"use `{database}`";
cmd.ExecuteNonQuery();

cmd.CommandText = "show table status;";

DataTable dtTables = new DataTable();

MySqlDataAdapter da2 = new MySqlDataAdapter(cmd);
da2.Fill(dtTables);

然后,遍历每个表以获取以下列值:

  • Name = 表的名称
  • Collation = 排序规则字符集

表字符集转换的SQL语句:

ALTER TABLE `{tablename}` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

在C#中,

foreach (DataRow dr2 in dtTables.Rows)
{
    string tablename = dr2["Name"] + "";
    string tableCollation = dr2["Collation"] + "";

    if (tableCollation != "utf8mb4_general_ci")
    {
        try
        {
            cmd.CommandText = $"ALTER TABLE `{tablename}` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;";
            cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            // log the error
        }
    }
}

https://www.codeproject.com/Articles/5328564/Easily-Convert-All-MySQL-Databases-Tables-To-utf8m

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0645s