Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   MySQL Workbench (https://www.delphipraxis.net/169511-mysql-workbench.html)

Delbor 25. Jul 2012 13:19

Datenbank: MySQL • Version: 5.5 • Zugriff über: MySQL Workbench

MySQL Workbench
 
Hi zuammen

Vor einiger Zeit habe ich mir MySQL Workbench installiert und damit meine DB modelliert.
In letzter Zeit war ich auch etwas am damit herumspielen, mit meinen schlechten Englischkenntnissen die Hilfedateien von Workbench zu studieren (und teilweise mit Google zu übersetzen).
Tja, und nun hab ichs doch tatsächlich geschafft:

MySQL Workbench zeigt mir eine Fehlermeldung, wenn ich mein Modell per ForwardEngeering in eine DB umsetzen lassen will. Meistens wars dann so, dass meine Tabellen in der DB erstellt wurden, ausser der einen, die mir Workbench als fehlerhaft meldete und allenfalls zwei damit verbundenen Interselektionstabellen - die können ja nicht erstellt werden, wenn eine von zwei Tabellen einer n:mBeziehung nicht erstellt wird.

Neuerdings erstellt Workbench aber gar keine Tabellen mehr. Die Meldung:

Zitat:

Operation has completed with errors.Please see logs for Details

Und das Log:

Zitat:

Executing SQL script in server
ERROR: Error 1050: Table '`delborpunktchdata`.`bilddatentabelle`' already exists

CREATE TABLE IF NOT EXISTS `delborpunktchdata`.`bilddatentabelle` (
`idBilddaten` INT(11) NOT NULL ,
`Bildtyp` VARCHAR(6) CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci' NOT NULL ,
`Bild` LONGBLOB NOT NULL ,
PRIMARY KEY (`idBilddaten`, `Bildtyp`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1

SQL script execution finished: statements: 6 succeeded, 1 failed
(Diese Tabelle existiert allerdings nicht (mehr), da ich die DB-Verzeichnisse geleert, bzw. gelöscht habe. In Workbench kann ich allerdings die komplette DB aus dem Katalog heraus neuzeichnen lassen...)

Im DB-Verzeichnis findet sich anschliessend gerade mal die Optionsdatei.
Ich bin inzwischen soweit, dass ich nur noch die Neuinstallation des MySQL Workbench sehe.
Das aber könnte nicht so einfach sein, wie es sich anhört, da nicht nur der Server, sondern auch Workbench etliche Dateien in verschiedenen Verzeichnissen speichert.

Kennt jemand diese Verzeichnissen?


Gruss
Delbor

Valle 25. Jul 2012 13:29

AW: MySQL Workbench
 
Zitat:

Zitat von Delbor (Beitrag 1175870)
(Diese Tabelle existiert allerdings nicht (mehr), da ich die DB-Verzeichnisse geleert, bzw. gelöscht habe. In Workbench kann ich allerdings die komplette DB aus dem Katalog heraus neuzeichnen lassen...)

Hab ich das richtig verstanden, du hast im DB-Verzeichnis Dateien gelöscht? So funktioniert das eigentlich nicht! Tabellen werden über DROP TABLE gelöscht, Datenbanken über DROP DATABASE. Falls man doch etwas manuell ändert, dann sollte man MySQL mal neu starten lassen. Allerdings entspricht in InnoDB nicht mehr jede Tabelle einer Datei, sodass ich von manuellen Änderungen generell abrate.

MySQL wird sich schon was dabei denken, wenn es meldet, dass die Tabelle bereits existiert. Was sagt denn SHOW TABLES dazu? Zeigt es die Tabelle auch an? Ich glaube eigentlich nicht, dass die Neuinstallation der MySQL Workbench hier einen Fehler behebt, zumindest sofern ich dein Prolem richtig verstanden habe. Eher hast du ein Problem mit deinem Server.

Liebe Grüße,
Valentin

Delbor 25. Jul 2012 14:14

AW: MySQL Workbench
 
Hi Valentin

Danke für die schnelle Antwort.

Zitat:

Falls man doch etwas manuell ändert, dann sollte man MySQL mal neu starten lassen. Allerdings entspricht in InnoDB nicht mehr jede Tabelle einer Datei, sodass ich von manuellen Änderungen generell abrate.
Das hab ich mal getan, bevor ich ein ForwardEngeering durchführte. Geändert hat sich nichts. Aber ich werd das mal wiederholen.

Zitat:

MySQL wird sich schon was dabei denken, wenn es meldet, dass die Tabelle bereits existiert. Was sagt denn SHOW TABLES dazu? Zeigt es die Tabelle auch an? Ich glaube eigentlich nicht, dass die Neuinstallation der MySQL Workbench hier einen Fehler behebt, zumindest sofern ich dein Prolem richtig verstanden habe. Eher hast du ein Problem mit deinem Server.
Da fällt mir doch glatt jene Signatur ein, die da heisst: Meistens sitzt das Problem zwischen den Ohren - denn natürlich hast du recht. Anstatt stundenlang nach irgendwelchen zuständigen Dateien und Verzeichnissen zu suchen, hätte ich von Anfang an SQL einsetzen sollen...

Ach ja: weisst du vielleicht gerade, was das bedeutet, wenn im Catalog tree von Workbench die Tabellenbezeichner am Schluss mit einem Punkt gekennzeichnet sind?

Gruss
Delbor

Medium 25. Jul 2012 23:44

AW: MySQL Workbench
 
Grundsätzlich zu InnoDB unter MySQL: Uns ist nach diversen Rettungsversuchen von Datenbanken ähnliches wiederfahren - heisst die DB an sich war laut MySQl Administrator nicht mehr da, aber beim CREATE TABLE hieß es sie sei es doch. MySQL speichert das Verzeichnis von InnoDBs an anderer Stelle als die Daten, und der Verzeichniseintrag reicht aus, um einen Tabellennamen zu blockieren. Wo die jeweiligen Dateien genau sitzen hängt von deinen Einstellungen ab.
Wenn man es also in der Hand hat, ist der Hinweis niemals manuell an den Dateien selbst zu doktorn das einzig richtige. Im Zweifel würde ich hier MySQL komplett deinstallieren, und ganz neu aufsetzen. Setzt natürlich voraus, dass man sonst nichts wichtiges in der DB verliert - aber wenn man sich schon traut einfach mal Dateien zu löschen, kann das ja eigentlich nicht sein ;)

Delbor 26. Jul 2012 18:59

AW: MySQL Workbench
 
Hi Medium

Auch dir vielen Dank für deine Antwort. Ich denke schon, dass es erstmal daran lag, dass ich Workbench mit einem 'X-beliebigen Programm' verwechselte und MySQL schlussendlich doch tiefere Einarbeitung abverlangt.

Der eigentliche Client wird mein Programm sein, und das setzt eigentlich ausschliesslich auf Delphis VCL auf. Mit der DB hat es eigentlich gerade mal soviel zu tun, dass es sich von da benötigte Daten holen und nach deren Bearbeitung wieder dahin zurückschreiben soll. Die Komplexität der Daten und deren Umfang lassen aber die Verwendung einer DB als sehr ratsam erscheinen.

In der DB selbst kann ich ausser einigen sehr wenigen Testdaten (die ein Zeichensatzproblem zutage brachten), nichts verlieren.
Das mit der kompletten Neuinstallation hatte ich schonmal. MySQL war als Dienst installiert und startete irgendwann nicht mehr, und ich wusste nicht, warum. Eine Neuinstallation war erst erfolgreich, nachdem ich unter Win7 das Verzeichnis ProgrammData (nicht Programme) gelöscht hatte.
Aus Workbench heraus lässt sich MySQL ja beenden und wieder hochfahren. Wahrscheinlich habe ich da einen Eintrag in einer Systemtabelle ausgelöst, den aber nicht mehr gelöscht (bzw. den Server wieder hochgefahren). So hat Windows offensichtlich den Server gestartet(wie es die 'Dienstanweisung' vorsieht), und Workbench (bzw. der Eintrag in der Systemtabelle) hat ihn wieder heruntergefahren...:lol:

Gruss
Delbor

himitsu 26. Jul 2012 21:14

AW: MySQL Workbench
 
Hast du es denn mal mit DROP TABLE versucht?



Und was passiert eigentlich, wenn man versucht eine Tabelle zu erstellen, wo schon eine gleichnamige Tabelle mit anderen Feldern/Spalten existiert?

Delbor 27. Jul 2012 08:43

AW: MySQL Workbench
 
Hi himitsu

Ja. Erstmal hab ich allerdings versucht, die Tabellen anzuzeigen. Die Abfrage lieferte 0 Rows zurück.
Etwas erfolgreicher war danach Drop Database - das Resultat war zwar auch 0, aber nac der Abfrage...
Show Database lieferte den Fehler 'unbekannt...' zurück.
Und als ich jetzt versuchte, mein DB-Modell erstellen zu lassen, hatte ich wieder die Ausgangssituation - die nicht erstellte Tabelle ist wiederum die Bilddatentabelle und die Interselektionstabellen zweier n:m-Beziehungen.

Der Code selbst war ja von Workbench erstellt worden - bzw. vom Server selbst. Die entsprechende Syntax selbst kann ja kaum fehlerhaft sein. Den gibt es ja seit Jahren, und daher dürfte er wohl milliardenfach erprobt sein.

Allerdings hatte ich den 5 von mir erstellten Tabellen jeweils alle vorgesehenen Felder zugewiesen, bevor ich die Beziehungen einzeichnete. die von Workbench eingefügten Fremd- und Sekundärschlüssel wurden auf diese Weise der Felderliste angehängt.

Die fragliche BilddatenTabelle besteht aus 3 Feldern - dem zusammengesetzten Primärschlüssel (AutoincFeld(int), Typfeld(VARCHAR(3) und dem Feld Bilddaten(LONGBLOB).
Der Hintergrund ist, dass es von jedem Bild bis zu drei Formate geben kann: das originale RAW-Format (das Original, enthält auch EXIF-Daten), ein Thumbnail(evtl. PNG o. jpeg) und eine Bitmap zur grafischen Bearbeitung(Weissabgleich etc, Umwandlung in Webtaugliches Jpeg).

Inzwischen vermute ich den Fehler an zwei möglichen Stellen:
  1. Das AutoincFeld und das Typfeld bilden zusammen den Primärschlüssel, sind aber aufgrund der Erstellungsfolge auf den Anfang und das Ende der Feldliste veteilt.
  2. Allenfalls ist für den Fehler auch der VARCHAR-Typ des Typfeldes verantwortlich - alle anderen Schlüssel sind integer

Etwas irritiert hat mich lange Zeit, dass die eine Interselektionstabelle 5 Schlüsselfelder enthält. Da ich aber trotz intensiven Suchens (Google, diverse Foren,MySQL.de) und einer Konzeptdiskussion keinen Hinweis auf eine negative Auswirkung auf die Performance durch mehrfach zusammengesetzte Schlüssel finden konnte, hab ich diesen Punkt fürs erste als erledigt abgehakt.

Gruss
Delbor

PS:
Zitat:

Und was passiert eigentlich, wenn man versucht eine Tabelle zu erstellen, wo schon eine gleichnamige Tabelle mit anderen Feldern/Spalten existiert?
Ich hab keine gleichnamigen Tabellen mit unterschiedlichen Feldern

Delbor 29. Jul 2012 22:41

AW: MySQL Workbench
 
Hi zusammen

Kürzlich bin ich in meinem neuen 'schlauen Buch' über einen kurzen, eher unscheinbaren Eintrag gestolpert. Danach sind zusammengesetzte Primärschlüssel, die ausser int auch andere Datentypen aufweisen, unter InnoDB nicht möglich.
So habe ich denn das Typfeld in der Bilddatentabelle(VARCHAR), die ja Teil des Primärschlüssels war, durch 3 Blobfelder für die verschiedenen Formate ersetzt.
Und siehe da - alle Tabellen wurden anstandslos erstellt....

Ein weiterer Punkt, den ich hier erwähnen möchte, betrifft die Speicherengine. MySQL verdankt seinen Ruf, schnell zu sein, der Engine MyIsam, verwendet aber standardmässsig heute die vielseitigere InnoDB...

Gruss
Delbor

Sir Rufo 30. Jul 2012 08:25

AW: MySQL Workbench
 
Zitat:

Zitat von Delbor (Beitrag 1176250)
Kürzlich bin ich in meinem neuen 'schlauen Buch' über einen kurzen, eher unscheinbaren Eintrag gestolpert. Danach sind zusammengesetzte Primärschlüssel, die ausser int auch andere Datentypen aufweisen, unter InnoDB nicht möglich.

So ist die Aussage nicht korrekt. Unter innoDB kann man ohne weiteres ein INT und VARCHAR Feld als PRIMARYKEY setzen.

Es ist allerdings fragwürdig, dieses in Zusammenhang mit einem AUTOINC (INT) Feld. Denn dieses Feld ist ja durch den automatisch vergebenen Wert eindeutig. Durch das weitere Feld wird es nicht eindeutiger. Also ist das nur überflüssiger Ballast für den PRIMARY KEY.

Delbor 1. Aug 2012 01:57

AW: MySQL Workbench
 
Hi Sir Rufo

Danke für deine Antwort! Es ist möglich, dass die entsprechende Passage in dem Buch für den PrimaryKey den AutoInc voraussetzte und ich diese Tatsache einfach überlesen habe.

Ich habe allerdings bemerkt, dass es MySQL offenbar kalt lässt, dass ich die Zeichensatz-Einstellungen von utf8 auf latin1 wändert habe - mit meinem Programm eingefügte Strings kommen nach wie vor als 'verunstaltete' Zeichhenfolgen daher.

Mit einer früheren Version von MySQL(aber auch 5.x) hatte ich die SQL-Stringvariable jeweils als Widestring definiert (D7). Das ist offenbar unter der aktuelllen Version nicht mehr gültig.

Gruss
Delbor

Bernhard Geyer 1. Aug 2012 06:08

AW: MySQL Workbench
 
Zitat:

Zitat von Delbor (Beitrag 1176516)
Ich habe allerdings bemerkt, dass es MySQL offenbar kalt lässt, dass ich die Zeichensatz-Einstellungen von utf8 auf latin1 wändert habe - mit meinem Programm eingefügte Strings kommen nach wie vor als 'verunstaltete' Zeichhenfolgen daher.

Welche Zeichensatzeinstellung? Für das DBMS? Für die DB? Für die einzelne Tabelle? Für deine Connection?

mkinzler 1. Aug 2012 06:57

AW: MySQL Workbench
 
Zitat:

Es ist möglich, dass die entsprechende Passage in dem Buch für den PrimaryKey den AutoInc voraussetzte
Ohne autoinc muss das Feld auf jeden Fall gesetzt werden. Für einen ( künstlichen) PK ist autoinc eine gute Option.
Zitat:

Ich habe allerdings bemerkt, dass es MySQL offenbar kalt lässt, dass ich die Zeichensatz-Einstellungen von utf8 auf latin1 wändert habe
Oder der Zugriffskomponente

Delbor 1. Aug 2012 09:41

AW: MySQL Workbench
 
Hi zusammen

Zitat:

Zitat von mkinzler (Beitrag 1176524)
Ich habe allerdings bemerkt, dass es MySQL offenbar kalt lässt, dass ich die Zeichensatz-Einstellungen von utf8 auf latin1 wändert habe

Oder der Zugriffskomponente[/QUOTE]

Der Zugriffskomponente? Da gibt's bei mir gerade mal die TSQL-Connection, TSQLDataset und TDatasource als Verbindung zu einem DB-Grid.
In einem Beispiel zu DBExpress emppfiehlt Embarcadero zwar eine 'Schlange' aus den Komponenten TSQLConnection,TSQLDataset, (TDatasource*), TClientDataSet und TDataSetProvider, die ich aber nicht verwende - ich habs mal versucht, aber irgendwie nicht die richtige Reihenfolge beim setzen der Propertys/nicht die richtige Komponente zum setzen eines/der Propertys erwwischt.
Seither begnüge ich mich mit den zuerst genannten 3 Komponenten. Und die bieten keine speziellen Propertys zum setzen des Zeichensatzes an, soweit ich gesehen habe.
Nach diesen Erklärungen ist dies aber auch gar nicht nötig - es ist letzlich so oder so eine Frage der Variablendeklaration..
Widerspruch wird gerne entgegengenommen.

Zitat:

Welche Zeichensatzeinstellung? Für das DBMS? Für die DB? Für die einzelne Tabelle? Für deine Connection?
Hmm, sehr gute Frage. Beim Erstellen des DB-Modells in MySQL-Workbench stelle ich die Sortierfolge (Collation) der Tabellen immer auf latin1-swedish_ci ein - damit ist der Zeichensatz automatisch latin1. Soweit ich die Hilfen richtig interpretiert habe (die sind in Workbench alle englisch), ist der Zeichensatz des MySQL-Servers standardmässig utf8 - und latin1 soll damit kompatibel sein. Der (Default-)Zeichensatz der DB selbst sollte eigentlich auch latin1 sein. Sollte er undefiniert sein, gilt für die DB m.W. die Einstellung des Servers. Entscheidend ist aber letztlich die Einstellung der Tabelle, respektive der Spalten (nicht-Var-Spalten können in Workbench gar keine Collations zugewiesen werden).
Den Zeichensatz der Connection (nicht Delphis TConnection-Komponente) sollte auch latin1 sein, aber das müsste ich nochmal überprüfen.


(*) Die wird m.W. da auch nur benötigt, wenn die SQL-Abfrage kein eigenes Grid zur Datenausgabe erzeugt.

Gruss
Delbor

Bernhard Geyer 1. Aug 2012 09:46

AW: MySQL Workbench
 
Zitat:

Zitat von Delbor (Beitrag 1176531)
Den Zeichensatz der Connection (nicht Delphis TConnection-Komponente) sollte auch latin1 sein, aber das müsste ich nochmal überprüfen.

Das ist die Frage und hier ist die Frage ob die Delphi-Komponente das richtig macht.

Wenn die verwendete Komponente z.B. nur die DB-Einstellung prüft und Latin1 sieht und dann auf einer utf8-Verbindung uncodiert Sonderzeichen abschickt wird der Server diese Zeichen natürlich als Falsch codiert ansehen und entsprechend Markieren.

Delbor 1. Aug 2012 10:25

AW: MySQL Workbench
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Bernhard

Hier mal ein Jpeg mit den Einstellungen der entsprechenden Systemvariablen.

Da ist alles utf8.

Im Konfigurationsfenster des Servers lässt sich allerdings die Collation einstellen. Ich habe das mal auf latin1-swedish_ci geändert. Da bislang keine Änderung erfolgt ist, nehme ich an, dass ein Neustart des Servers erforderlich ist.

Wenn ich die verlinkte Hilfeseite alledings richtig interpretiert habe, sollte der normale (Unicode-)String von DelphiXE mit utf8 klarkommen, bzw. umgekehrt...

Gruss
Delbor

Bernhard Geyer 1. Aug 2012 11:01

AW: MySQL Workbench
 
Zitat:

Zitat von Delbor (Beitrag 1176538)
Im Konfigurationsfenster des Servers lässt sich allerdings die Collation einstellen. Ich habe das mal auf latin1-swedish_ci geändert. Da bislang keine Änderung erfolgt ist, nehme ich an, dass ein Neustart des Servers erforderlich ist.

Deine Datenbank(tabellen) die schon erstellt wurden bleiben trotzdem auf UTF8. Das was du als Systemeinstellung einstellst ist sowas wie Vorgabe (Tabell erstellen ohne Collation-Angabe -> Nimm Systemvorgabe). Collations von Existierenden Elementen werden nicht geändert.

Zitat:

Zitat von Delbor (Beitrag 1176538)
Wenn ich die verlinkte Hilfeseite alledings richtig interpretiert habe, sollte der normale (Unicode-)String von DelphiXE mit utf8 klarkommen, bzw. umgekehrt...

Nicht unbedingt. Über TCP/IP kann MySQL nur 1-Byte Charactersets. Die Zugriffskomponente muss entsprechend UTF8/Unicode-Zeichen korrekt umcodieren. Evtl. ist ein Bug in den Kompos von Delphi

Delbor 1. Aug 2012 11:06

AW: MySQL Workbench
 
Hi Bernhard

Zitat:

Wenn die verwendete Komponente z.B. nur die DB-Einstellung prüft und Latin1 sieht...
Ich denke, ich habe alle verwendeten Komponenten nach einem Property zur Einstellung des Zeichensatzes durchsucht, auch diejenigen der erwähnten 'Schlange' aus dem DBExpress-Beispiel, bin aber bislang nicht fündig geworden. Deshalb gehe ich ja davon aus, dass zum korrekten schreiben und lesen des Strings allein die verwendeten Variablentypen (AnsiString, Widestring etc. verantwortlich sind.

Gruss
Delbor

Delbor 1. Aug 2012 11:23

AW: MySQL Workbench
 
Hi Bernhard

Zitat:

Nicht unbedingt. Über TCP/IP kann MySQL nur 1-Byte Charactersets. Die Zugriffskomponente muss entsprechend UTF8/Unicode-Zeichen korrekt umcodieren. Evtl. ist ein Bug in den Kompos von Delphi
Wie geht dann MYSQL mit Zeichensätzen um, die mehr als 1 Byte haben/haben können?
Datebank-Server innerhalb Japans zB sind wohl kaum mit 1-Byte-Zeichensätzen konfiguriert.
Und ausser TCP/IP ist TCP/IP über SSH oder als 3. Möglichkeit über local Socket/Pipe möglich - und eigentlich sollte MySQL nur gerade über letztere Verbindung Zeichensätze mit mehr als einem Byte verarbeiten können - und würde dadurch wohhl für die Verwendung über Internet ausfallen...
Also muss ich wohl irgendwas völlig falsch verstanden haben...

Gruss
Delbor

Delbor 2. Aug 2012 14:52

AW: MySQL Workbench
 
Hi zusammen

Dachte ich mir's doch:

Das soll Missverständnisse verhindern, die dadurch entstehen könnten:

Zitat:

Über TCP/IP kann MySQL nur 1-Byte Charactersets.
In älteren MySQL-Versionen ist dies zwar noch denkbar, aber nicht ab MySQL 5.5 (?).

Im Programm lassen sich die Zeichensätze für die aktuelle Session ändern - meine komischen Ausgaben wie zB "Ã#ste" statt Äste sind dann für die Laufzeit des Programms kein Problem mehr. (Wobei das Sharp für ein mir unbekanntes, leicht ähnliches Zeichen steht).
Die Syntax: 'SET NAMES ´latin1`. Damit ist der Zeichensatz allerdings nur gerade zur aktuellen Programmlaufzeit gültig - der Zeichensatz des Servers ist weiterhin utf8 (Standard ab 5.?).

Zur Beruhigung all jener, für die das Thema auch etwas rätselhaft ist...


Gruss
Delbor

mquadrat 3. Aug 2012 09:51

AW: MySQL Workbench
 
Also zunächst mal muss man ja zwischen Character-Set und Collation unterscheiden. Sind ja unterschiedliche Sachen. Die sollten allerdings zusammenpassen. Eine Tabelle mit Character-Set UTF8 und Collation latin1_* macht keinen Sinn. Zweite Aussage: Daten die falsch gespeichert wurden, bleiben auch nach dem Umstellen falsch.

- Character-Set der Tabelle prüfen
- Collation der Tabelle prüfen
- Beim Aufbauen der Verbindung Sets via SET NAMES und SET CHARACTER SET für die Verbindung einstellen

Wird alles explizit gesetzt, ist die Einstellung des Servers übrigens egal.

Manche Komponenten haben eine Property für den Character-Set der Verbindung und führen die SET Befehle beim Verbindungsaufbau dann automatisch aus. Normalerweise sollte die Komponente die u.U. nötige Umwandlung von Unicode nach Latin1 und/oder zurück selber hinkriegen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz