ILIAS 9 for Ubuntu 22.04

Collation checker and changer

  • Use it at your ow risk
  • This can destroy your database!
#!/bin/bash
 
# Einstellungen: Datenbankname und gewünschte Kollation
DATABASE_NAME="deine_datenbank"
DESIRED_CHARSET="utf8"
DESIRED_COLLATION="utf8_unicode_ci"
 
# MySQL Benutzer und Host (ggf. anpassen)
MYSQL_USER="root"
MYSQL_HOST="localhost"
 
# Optional: Anmeldedaten (leer lassen, wenn root ohne Passwort)
MYSQL_PASSWORD=""
 
# Prüfen, ob das Passwort benötigt wird
if [ -z "$MYSQL_PASSWORD" ]; then
MYSQL_CMD="mysql -u$MYSQL_USER -h$MYSQL_HOST"
else
MYSQL_CMD="mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -h$MYSQL_HOST"
fi
 
# Überprüfen, ob die Datenbank existiert
echo "Überprüfe die Existenz der Datenbank '$DATABASE_NAME'..."
DB_EXISTS=$($MYSQL_CMD -e "SHOW DATABASES LIKE '$DATABASE_NAME';" -s -N)
 
if [ -z "$DB_EXISTS" ]; then
echo "Die Datenbank '$DATABASE_NAME' existiert nicht. Abbruch!"
exit 1
fi
 
# Ändern der Tabellenkollation in der gesamten Datenbank
echo "Ändere die Kollation der Datenbank '$DATABASE_NAME' auf '$DESIRED_COLLATION'..."
$MYSQL_CMD -e "ALTER DATABASE \`$DATABASE_NAME\` CHARACTER SET $DESIRED_CHARSET COLLATE $DESIRED_COLLATION;"
 
# Hole die Liste aller Tabellen in der angegebenen Datenbank
echo "Hole die Liste der Tabellen in der Datenbank '$DATABASE_NAME'..."
TABLES=$($MYSQL_CMD -e "SHOW TABLES IN $DATABASE_NAME;" -s -N)
 
# Schleife über alle Tabellen in der Datenbank
for TABLE in $TABLES; do
echo "Verarbeite Tabelle '$TABLE'..."
 
# Ändere die Kollation der gesamten Tabelle, falls möglich
$MYSQL_CMD -e "ALTER TABLE \`$DATABASE_NAME\`.\`$TABLE\` CONVERT TO CHARACTER SET $DESIRED_CHARSET COLLATE $DESIRED_COLLATION;" 2>/dev/null
 
# Überprüfen der Spaltenkollationen und Spaltentypen (nur textbasierte Spalten)
COLUMNS=$($MYSQL_CMD -e "
SELECT COLUMN_NAME, COLUMN_TYPE, CHARACTER_SET_NAME, COLLATION_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA='$DATABASE_NAME'
AND TABLE_NAME='$TABLE'
AND COLLATION_NAME IS NOT NULL
AND CHARACTER_SET_NAME IS NOT NULL;"
-s -N)
 
# Prüfen, ob die Tabelle textbasierte Spalten enthält
if [ -z "$COLUMNS" ]; then
echo "Keine textbasierten Spalten in Tabelle '$TABLE' vorhanden. Überspringe..."
continue
fi
 
# Schleife über alle textbasierten Spalten
while IFS=$'\t' read -r COLUMN_NAME COLUMN_TYPE CURRENT_CHARSET CURRENT_COLLATION; do
 
# Überprüfe, ob der Spaltenname korrekt extrahiert wurde
if [[ -z "$COLUMN_NAME" || -z "$COLUMN_TYPE" ]]; then
echo "Fehler: Ungültige Spalteninformationen für Tabelle '$TABLE'. Überspringe..."
continue
fi
 
# Falls die Spalte bereits den gewünschten Zeichensatz und die gewünschte Kollation hat, überspringen
if [ "$CURRENT_CHARSET" == "$DESIRED_CHARSET" ] && [ "$CURRENT_COLLATION" == "$DESIRED_COLLATION" ]; then
echo "Spalte '$COLUMN_NAME' in Tabelle '$TABLE' verwendet bereits die gewünschte Kollation '$DESIRED_COLLATION'."
continue
fi
 
echo "Ändere Kollation der Spalte '$COLUMN_NAME' (Typ: $COLUMN_TYPE) in Tabelle '$TABLE' auf '$DESIRED_COLLATION'..."
 
# Verwende die vollständige MODIFY-Anweisung mit dem korrekten Spaltennamen und Typ
$MYSQL_CMD -e "ALTER TABLE \`$DATABASE_NAME\`.\`$TABLE\` MODIFY \`$COLUMN_NAME\` $COLUMN_TYPE CHARACTER SET $DESIRED_CHARSET COLLATE $DESIRED_COLLATION;"
 
# Überprüfung auf Syntaxfehler
if [ $? -ne 0 ]; then
echo "Fehler beim Ändern der Kollation für die Spalte '$COLUMN_NAME' in der Tabelle '$TABLE'."
else
echo "Spalte '$COLUMN_NAME' in der Tabelle '$TABLE' erfolgreich geändert."
fi
done <<< "$COLUMNS"
 
echo "Tabelle '$TABLE' erfolgreich konvertiert."
done
 
echo "Alle Tabellen und Spalten in der Datenbank '$DATABASE_NAME' wurden erfolgreich auf '$DESIRED_COLLATION' konvertiert."
 
# Ausgabe der Kollationen für jede Tabelle in der Datenbank
echo ""
echo "Kollationen der Tabellen in der Datenbank '$DATABASE_NAME':"
$MYSQL_CMD -e "
SELECT TABLE_NAME, TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_SCHEMA='$DATABASE_NAME';"


No comment has been posted yet.