- 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