- 源代码: 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