Page 1 of 1

MYSQL richtig konfigurieren

Posted: Wed 27. Jul 2022, 17:51
by ple1m
Nach der Installation einer Foren-Software bekomme ich auf vereinzelten Seiten folgende Fehlermeldung:

Code: Select all

mysql error: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation 'like'
mysql error number: 1267
mysql version: 10.3.34-MariaDB-0ubuntu0.20.04.1
php version: 5.5.38  
Daraufhin habe ich die Kollation innerhalb der Datenbank erstmal vereinheitlicht. Mit diesem Befehl SSH:

Code: Select all

DB="XXXXXXX"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"
Das Ganze hat so weit auch gut funktioniert und alle Tabellen haben jetzt die gleich Kollation
Allerdings bekomme ich immer noch die eingangs genannte Fehlermeldung.

Ich vermute, es gibt Probleme mit dem Standard Server-Zeichensatz: UTF-8 Unicode (utf8mb4)

Leider lassen sich die Tabellen aber nicht dazu bewegen, die Kollation utf8mb4_general_ci anzunehmen.

Code: Select all

ERROR 1253 (42000) at line 1: COLLATION 'utf8mb4_general_ci' is not valid for CHARACTER SET 'utf8'
xargs: echo: terminated by signal 13
root@server:~#
Muss ich nun den Server Zeichensatz ändern? Das würde ich gern umgehen, wenn möglich.

Re: MYSQL richtig konfigurieren

Posted: Wed 27. Jul 2022, 21:23
by Viktor
Hallo,

der Code für "utf8mb4" sieht so aus.

Code: Select all

DB="XXXXXXX"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'; mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' ) | mysql "$DB"
Versuche es mal mit dem Code.

Gruß
Viktor ;)

Re: MYSQL richtig konfigurieren

Posted: Thu 28. Jul 2022, 11:04
by ple1m
Hallo Viktor ;)

Leider lassen sich nicht alle Tabellen in der Datenbank mit dem Befehl in utf8mb4_unicode_ci konvertieren.
Nach der Eingabe im Terminal erhalte ich diesen Fehler:

Code: Select all

ERROR 1071 (42000) at line 51: Specified key was too long; max key length is 1000 bytes
xargs: echo: terminated by signal 13
root@server:~#
Einen Blick in die Datenbank zeigt auch das Resultat. Nur die ersten 59 der gesamt 316 Tabellen wurden nach dem Befehl in utf8mb4_unicode_ci konvertiert.
Die restlichen zeigen noch utf8_general_ci
123.jpg
Was ist mit der Schlüssellänge gemeint, von der in der Fehlermeldung die Rede ist?
Muss ich diese auf dem Server vorher konfigurieren? Wenn ja... wo?

Re: MYSQL richtig konfigurieren

Posted: Thu 28. Jul 2022, 11:25
by Florian
Hallo,

der Thread passt wie die Faust aufs Auge, wird sogar ein Keyhelp benutzt:

https://www.woltlab.com/community/threa ... 000-bytes/

Re: MYSQL richtig konfigurieren

Posted: Thu 28. Jul 2022, 15:02
by ple1m
Hallo Florian,

irgendwie stehe ich auf dem Schlauch.

SunnyC schrieb bei woltlab:
Muss ich das hier umbenennen?

Code: Select all

#DROP TABLE IF EXISTS 4images_settings;
CREATE TABLE 4images_settings (
  setting_name varchar(255) NOT NULL default '',
  setting_value mediumtext NOT NULL,
  PRIMARY KEY  (setting_name)
) ENGINE=MyISAM;
in ENGINE=InnoDB ?

Code: Select all

#DROP TABLE IF EXISTS 4images_settings;
CREATE TABLE 4images_settings (
  setting_name varchar(255) NOT NULL default '',
  setting_value mediumtext NOT NULL,
  PRIMARY KEY  (setting_name)
) ENGINE=InnoDB;
Das hat geklappt

Aus den Beiträgen geht nicht hervor, in welcher Datei SunnyC die Änderung vorgenommen hat. :?:
Vermutlich nur in diesem Script "4images". Den nutze ich auf meinem Server aber nicht.

Re: MYSQL richtig konfigurieren

Posted: Thu 28. Jul 2022, 15:37
by Florian
Hallo,

nein. Die Lösung ist hier die Tabellen von MyISAM umzustellen auf InnoDB.

Das geht mittels ALTER TABLE Befehl auf der Konsole oder auch per Click im PHPmyAdmin. Wie genau, findet du in zahlreichen HowTOs im Netz.

Re: MYSQL richtig konfigurieren  [SOLVED]

Posted: Thu 28. Jul 2022, 18:19
by ple1m
Ich möchte mich erstmal ganz herzlich bei Dir und Viktor bedanken.
Ohne Euch wäre ich hoffnungslos verloren gewesen. Ihr habt mich in die richtige Richtung gestoßen. :D

Ungern wollte ich jetzt jede einzelne der über 300 Tabellen mit dem „ALTER TABLE Befehl“ per Hand auf InnoDB umstellen. :roll:

Da ich Supportforen sehr schätze, möchte ich nun auch die auf gefühlt 1000 Seiten recherchierte Lösung mitteilen, welche die Konvertierung in einem Rutsch erledigt und zum Erfolg geführt hat:

MySQL ausführbar starten, die zu ändernde Datenbank auswählen und folgende Abfrage ausführen:

Code: Select all

DROP PROCEDURE IF EXISTS convertToInnodb;
DELIMITER //
CREATE PROCEDURE convertToInnodb()
BEGIN
mainloop: LOOP
  SELECT TABLE_NAME INTO @convertTable FROM information_schema.TABLES
  WHERE `TABLE_SCHEMA` LIKE DATABASE()
  AND `ENGINE` LIKE 'MyISAM' ORDER BY TABLE_NAME LIMIT 1;
  IF @convertTable IS NULL THEN 
    LEAVE mainloop;
  END IF;
  SET @sqltext := CONCAT('ALTER TABLE `', DATABASE(), '`.`', @convertTable, '` ENGINE = INNODB');
  PREPARE convertTables FROM @sqltext;
  EXECUTE convertTables;
  DEALLOCATE PREPARE convertTables;
  SET @convertTable = NULL;
END LOOP mainloop;

END//
DELIMITER ;

CALL convertToInnodb();
DROP PROCEDURE IF EXISTS convertToInnodb;
Quelle: https://code-examples.net/de/q/3ad833

Danach habe ich im Terminal noch mal diesen Befehl ausgeführt:

Code: Select all

DB="hier_Datenbankname_eintragen"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'; mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' ) | mysql "$DB"
Vielen Dank nochmal für die Hilfestellung. Dieses Problem ist nun gelöst. 8-)