#!/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';" |