MYSQL richtig konfigurieren  [SOLVED]

For topics beyond KeyHelp. / Für Themen jenseits von KeyHelp.
Post Reply
ple1m
Posts: 36
Joined: Sun 9. Jul 2017, 19:50

MYSQL richtig konfigurieren

Post 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.
User avatar
Viktor
Posts: 60
Joined: Fri 21. May 2021, 22:23
Location: Wesel
Contact:

Re: MYSQL richtig konfigurieren

Post 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 ;)
ple1m
Posts: 36
Joined: Sun 9. Jul 2017, 19:50

Re: MYSQL richtig konfigurieren

Post 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?
Last edited by ple1m on Thu 28. Jul 2022, 11:28, edited 1 time in total.
User avatar
Florian
Keyweb AG
Posts: 1243
Joined: Wed 20. Jan 2016, 02:28

Re: MYSQL richtig konfigurieren

Post by Florian »

Hallo,

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

https://www.woltlab.com/community/threa ... 000-bytes/
Mit freundlichen Grüßen / Best regards
Florian Cheno

**************************************************************
Keyweb AG - Die Hosting Marke
Neuwerkstr. 45/46, 99084 Erfurt / Germany
http://www.keyweb.de - http://www.keyhelp.de
**************************************************************
ple1m
Posts: 36
Joined: Sun 9. Jul 2017, 19:50

Re: MYSQL richtig konfigurieren

Post 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.
User avatar
Florian
Keyweb AG
Posts: 1243
Joined: Wed 20. Jan 2016, 02:28

Re: MYSQL richtig konfigurieren

Post 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.
Mit freundlichen Grüßen / Best regards
Florian Cheno

**************************************************************
Keyweb AG - Die Hosting Marke
Neuwerkstr. 45/46, 99084 Erfurt / Germany
http://www.keyweb.de - http://www.keyhelp.de
**************************************************************
ple1m
Posts: 36
Joined: Sun 9. Jul 2017, 19:50

Re: MYSQL richtig konfigurieren  [SOLVED]

Post 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-)
Post Reply