Diskussion zum Artikel "Wie man auf die MySQL-Datenbank von MQL5 (MQL4) aus zugreift" - Seite 29

 
Viktor Vasilyuk #:

Danke für die Aufklärung. Ich kann nicht alles wissen, deshalb frage ich ja.

Ich habe die Lösung für mich hier gefunden.

P.S: Überprüft für SELECT - es funktioniert

Nun, die Konvertierung des Abfrageergebnisses ist erlaubt, aber vergessen Sie nicht, dass Sie eine Definition von utf8mb4 auf Tabellenebene haben, d.h. für alle Felder wird standardmäßig varchar verwendet, und wenn Sie eine Bedingung in der Abfrage für ein Textfeld haben, wird MySQL versuchen, implizit zu konvertieren. Und wenn Sie berücksichtigen, dass Sie vielleicht einen Index auf einer Textspalte aufgebaut haben, dann kann es sein, dass der Optimierer ihn während einer solchen Konvertierung nicht auffängt... daher Probleme mit der Abfrageleistung.
Es ist also wünschenswert, solche Dinge sowohl auf der Ebene der Tabelle als auch auf der Ebene der Spaltendefinition zu kontrollieren.
 
Eugeniy Lugovoy #:
Nun, die Konvertierung von Abfrageergebnissen ist erlaubt, aber vergessen Sie nicht, dass Sie eine utf8mb4-Definition auf Tabellenebene haben, d.h. für alle Felder wird standardmäßig varchar verwendet, und wenn Sie eine Bedingung für ein Textfeld in Ihrer Abfrage haben, wird MySQL versuchen, es implizit zu konvertieren. Und wenn Sie berücksichtigen, dass Sie vielleicht einen Index auf einer Textspalte aufgebaut haben, dann kann es sein, dass der Optimierer ihn während einer solchen Konvertierung nicht erkennt ... daher Probleme mit der Abfrageleistung.
Es ist also wünschenswert, solche Dinge sowohl auf der Ebene der Tabelle als auch auf der Ebene der Spaltendefinition zu kontrollieren.

Es gibt ein Beschreibungsfeld. Etwas wie "Kommentare", das Feld ist nicht notwendig, nur eine Texterklärung. Es wird keinen Index geben.

MySQL utf8mb4 tut standardmäßig. Können Sie mir sagen, wie man in DDL das nächste Mal angeben? Was zu ändern und auf welche Kodierung

 
Aus Neugier ist MQLmySQL wählerisch über Datenbanktypen? Wir laufen in ein Problem, wo unser Skript verwendet, um die Datenbank zu verbinden, bis wir zu einer neuen Datenbank migriert. Plötzlich haben wir Probleme mit Lesen/Schreiben/Löschen. Alle Berechtigungen für Port 3306 sind aktiviert, und die neue db ist einfach eine Kopie der alten.

Jede Ideen?
 
Boaz Nyagaka Moses #:
Ich erhalte ständig diesen Fehler:
2022.03.02 20:22:25.198 MySQL-001 EURUSD,M15: Verbindungsfehler #2059 Authentifizierungs-Plugin 'caching_sha2_password' kann nicht geladen werden: Das angegebene Modul konnte nicht gefunden werden.

Konnten Sie dieses Problem jemals lösen, Boaz?

 

Gibt es eine Möglichkeit, die Anzahl der Felder zu kennen, die nach MySqlCursorFetchRow abgerufen werden können?

Vielleicht eine versteckte Funktion wie RowFieldsSize ...


Wie ich verstehe, wenn es kein Feld gibt, gibt MySqlGetFieldAsString leer zurück. Aber auch, wenn String Field speziell ein leeres Feld enthält, gibt es auch leer zurück. Das heißt, es ist nicht immer möglich, die Anzahl der Felder mit brachialer Gewalt zu ermitteln.


Als Krücke kann man zwar erst per SQL-Befehl herausfinden, dann aber wieder selektieren, aber das ist schon ein unnötiges Select.



Bitte entwickeln Sie die Bibliothek weiter, eine sehr nützliche Sache. Natürlich vor langer Zeit ein paar mysql zu bauen in mt

 

Abfrage einfügen und aktualisieren - nur 16 kb Abfragelimit ?


Wenn die Abfrage mehr als 16.000 Zeichen ist, stürzt metatrader ab (schließt). wenn weniger, ist es in Ordnung.

Ich füge ein Beispiel von UPDATE für 32.000 Zeichen bei.


Feld zum Aktualisieren in der Datenbank - LONGTEXT

Dateien:
test2.txt  64 kb
 
andreysneg #:

Abfrage einfügen und aktualisieren - nur 16kb Abfragelimit ?


Wenn die Abfrage mehr als 16.000 Zeichen ist, stürzt metatrader ab (schließt). wenn weniger, ist es in Ordnung.

Ich füge ein Beispiel von UPDATE für 32.000 Zeichen bei.


Feld zum Aktualisieren in der Datenbank - LONGTEXT

Dies ist eher eine Zeilenbegrenzung in MQL :-(

und man kann kompakter schreiben:

REPLACE d1 ("t", "o", "h", "l", "c") VALUES (time1,open1,high1,low1,close1), (time2,open2,high2,low2,close2) ....

und/oder in zwei Abfragen aufgeteilt werden, indem sie in einer einzigen Transaktion kombiniert werden

 
Hallo! Frage für Experten - wie viele Daten und wie oft kann ich von MySQL zu MT5 lesen?
Zum Beispiel habe ich Daten 50 000 Elemente und ich aktualisieren sie in der Tabelle alle 0,1 sec (Zahlen). Ist MT5 in der Lage, diese Daten aus MySQL zu übernehmen und sie alle 0,1 Sekunden zu aktualisieren? Gibt es irgendeine Einschränkung der in diesem Artikel beschriebenen Funktionalität in Bezug auf KB pro 1 Abfrage?
 
Alex Renko #:
Hallo! Frage für Experten - wie viele Daten und wie oft kann ich von MySQL zu MT5 lesen?
Zum Beispiel habe ich Daten 50 000 Elemente und ich aktualisieren sie in der Tabelle alle 0,1 sec (Zahlen). Ist MT5 in der Lage, diese Daten aus MySQL zu übernehmen und sie alle 0,1 Sekunden zu aktualisieren? Gibt es irgendeine Einschränkung der Funktionalität in diesem Artikel auf KB für 1 Abfrage gegeben?

Nun, die Frage ist sicherlich interessant ...

Ich muss sagen, dass es keine Beschränkungen für die Anzahl der zurückgegebenen SELECT-Abfragezeilen gibt.

Die Größenbeschränkung für die Abfrage selbst liegt bei 64 Kb. Wenn Sie also versuchen, 50k Datenzeilen zu aktualisieren, ist es besser, sie in Stapel aufzuteilen, z.B. je 1000 Zeilen, und somit 50 Abfragen zu senden.

Was die Geschwindigkeit von 100 ms betrifft, so werden Sie, wenn Sie die Datenbank auf einem Server haben und Ihr Terminal, auf dem Sie MQL mit einer Verbindung zur Datenbank ausführen, etwas entfernt ist, höchstwahrscheinlich auf eine Netzwerklatenz in der Größe des ping.... stoßen.

Wenn Sie zum Beispiel einen Ping von 60 ms zwischen dem Datenbankserver und dem Terminal haben, wird die tatsächliche Antwort vom Server verzögert = 60 ms (Abfrage) + Abfrageverarbeitungszeit auf der Datenbankseite + 60 ms (Antwort).


Dieses Projekt ist nur ein einfacher Wrapper für den Zugriff auf die Funktionalität der dynamischen mysql-Bibliotheken.

Der Funktionsumfang ist auf die wichtigsten praktisch nützlichen Funktionen beschränkt, man kann es erweitern, hinzufügen, was man braucht, z.B. Unterstützung für asynchrone Abfragen hinzufügen, und dann kann man alle 50 Abfragen auf 1000 Zeilen senden, ohne auf die Ausführung jeder einzelnen zu warten.


P.S.: Auf Github können Sie die Quellen der Bibliothek und die voreingestellten Grenzen sehen(https://github.com/elugovoy/MQLMySQL-Project/tree/master/MQLMySQL).

P.P.S.: Sie können die Bibliothek auch herunterladen, nach eigenem Ermessen verändern, kompilieren und testen.

MQLMySQL-Project/MQLMySQL at master · elugovoy/MQLMySQL-Project
  • elugovoy
  • github.com
MQL & DLL libraries for working with MySQL database - elugovoy/MQLMySQL-Project
 
andreysneg #:

Gibt es eine Möglichkeit, die Anzahl der Felder zu kennen, die nach MySqlCursorFetchRow abgerufen werden können?

Vielleicht gibt es eine versteckte Funktion wie RowFieldsSize ...


Wie ich verstehe, wenn es kein Feld gibt, gibt MySqlGetFieldAsString leer zurück. Aber auch, wenn String Field speziell ein leeres Feld enthält, gibt es auch leer zurück. D.h. es ist nicht immer möglich, die Anzahl der Felder mit brachialer Gewalt zu ermitteln.


Als Krücke kann man zwar erst per sql-Befehl herausfinden, dann aber wieder selektieren, aber das ist schon ein unnötiges Select.



Bitte entwickeln Sie die Bibliothek, sehr nützliche Sache. Natürlich, ein paar mysql sollte in mt vor langer Zeit gebaut werden

Hm... und welche Art von Abfragen sind so knifflig bei Ihnen, dass es notwendig ist, die Anzahl der Felder, die von ihm zurückgegeben werden, zu bestimmen?

Normalerweise wird im SELECT-Befehl nur aufgeführt, was in einer bestimmten Situation benötigt wird. Verwenden Sie nicht SELECT *, sondern wählen Sie nur das aus, was Sie brauchen :) das ist normale Praxis.

Sie sollten keine Krücken machen, Sie können den Quellcode von Github nehmen und einen Wrapper für mysql_fetch_fields() MySQL API Funktion hinzufügen