资讯详情

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

  • 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

标签: express连接器mb

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台