Skip to content

Commit 1e4afef

Browse files
committed
Make All UTF8 MB4 in MySQL
1 parent 009c144 commit 1e4afef

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

Shoko.Server/Databases/MySQL.cs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -924,6 +924,7 @@ public class MySQL : BaseDatabase<MySqlConnection>
924924
new(148, 01, "ALTER TABLE `AniDB_Character` ADD `Type` int NOT NULL DEFAULT 0;"),
925925
new(148, 02, "ALTER TABLE `AniDB_Character` ADD `LastUpdated` datetime NOT NULL DEFAULT '1970-01-01 00:00:00';"),
926926
new(148, 03, DatabaseFixes.RecreateAnimeCharactersAndCreators),
927+
new(149, 1, MySQLFixUTF8MB4)
927928
};
928929

929930
private DatabaseCommand linuxTableVersionsFix = new("RENAME TABLE versions TO Versions;");
@@ -1474,4 +1475,46 @@ private static void MySQLFixUTF8()
14741475
}
14751476
}
14761477
}
1478+
1479+
private static void MySQLFixUTF8MB4()
1480+
{
1481+
var settings = Utils.SettingsProvider.GetSettings();
1482+
var sql =
1483+
"SELECT `TABLE_SCHEMA`, `TABLE_NAME`, `COLUMN_NAME`, `DATA_TYPE`, `CHARACTER_MAXIMUM_LENGTH` " +
1484+
"FROM information_schema.COLUMNS " +
1485+
$"WHERE table_schema = '{settings.Database.Schema}' " +
1486+
"AND collation_name = 'utf8_general_ci'";
1487+
1488+
using (var conn = new MySqlConnection(
1489+
$"Server={settings.Database.Hostname};Port={settings.Database.Port};User ID={settings.Database.Username};Password={settings.Database.Password};database={settings.Database.Schema}"))
1490+
{
1491+
var mySQL = (MySQL)Utils.ServiceContainer.GetRequiredService<DatabaseFactory>().Instance;
1492+
conn.Open();
1493+
var rows = mySQL.ExecuteReader(conn, sql);
1494+
if (rows.Count > 0)
1495+
{
1496+
foreach (object[] row in rows)
1497+
{
1498+
var alter = "";
1499+
switch (row[3].ToString().ToLowerInvariant())
1500+
{
1501+
case "text":
1502+
case "mediumtext":
1503+
case "tinytext":
1504+
case "longtext":
1505+
alter =
1506+
$"ALTER TABLE `{row[1]}` MODIFY `{row[2]}` {row[3]} CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'";
1507+
break;
1508+
1509+
default:
1510+
alter =
1511+
$"ALTER TABLE `{row[1]}` MODIFY `{row[2]}` {row[3]}({row[4]}) CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'";
1512+
break;
1513+
}
1514+
1515+
mySQL.ExecuteCommand(conn, alter);
1516+
}
1517+
}
1518+
}
1519+
}
14771520
}

0 commit comments

Comments
 (0)