2017-12-15 2 views
0

Ich arbeite an einem Tool, das SQL für eine MySQL-Datenbank generiert und ausführt. Ich versuche, die Möglichkeit hinzuzufügen, die Größe einer Einfügeanweisung basierend auf einer benutzerdefinierten Einstellung zu begrenzen. Ich habe einige Informationen über die Einstellung max_allowed_packet gefunden, aber ich habe nichts gefunden, was erklärt, wie man die Größe eines Pakets berechnet. Die MySQL-Dokumentation sagt, dass "Ein Kommunikationspaket eine einzelne SQL-Anweisung ist, die an den MySQL-Server gesendet wird", aber ich verstehe nicht, wie die Größe der SQL-Anweisung bestimmt wird.Berechnung der Größe einer MySQL-Anweisung (nicht der Abfrageergebnisse)

ich vorbei eine SQL-Anweisung und einige Parameter zu meinem Fahrer:

cmd.CommandText= "INSERT INTO myTable VALUES(@int, @date, @text)"; 
cmd.Parameters.AddWithValue("@int", 1); 
cmd.Parameters.AddWithValue("@date", DateTime.Now); 
cmd.Parameters.AddWithValue("@text", "how big is this???"); 
cmd.ExecuteNonQuery(); 

Ist die Größe des Pakets nur die Summe der Bytes im String-Darstellung aller Variablen und die SQL-Anweisung ? Oder sollte ich die Größe jedes Parameters auf der Basis herausfinden, wie viel Platz er in der Datenbank einnehmen würde und wie groß er mit den Bytes in der SQL-Zeichenkette sein würde? Oder etwas anderes? Ich bin nicht wirklich sicher, wie Datenbanktreiber funktionieren, also wäre vielleicht ein Kontext hilfreich, wenn Sie etwas darüber wissen.

+0

Aus Scher-Neugier, warum möchten Sie die Größe einer Insert-Anweisung begrenzen? –

+0

Ich habe das Limit für max_packet_allowed ein paar Mal erreicht, und ich möchte diese Einstellung nicht nur für einige Randfälle in der App ändern. –

Antwort

0

Stellt sich heraus, dass das max_allowed_packet mit der Größe der resultierenden Abfrage verglichen wird, die über die Leitung in ASCII-Codierung gesendet wurde. Ich habe die Parameterwerte anstelle der Parameternamen in die SQL-Anweisung eingefügt und die Größe der resultierenden Zeichenfolge übernommen.Die Anzahl der Bytes war eine genaue Vorhersage, ob die Anweisung von MySQL abgelehnt wurde oder nicht, so dass ich herausfinden konnte, wann ich eine neue Aussage basierend auf dieser Zahl starten sollte.

0

Mein Verständnis der Paketgröße, wie in MySql max_packet_allowed definiert, stammt aus der Dokumentation. Ich verbrachte einige Zeit damit, nach einer definitiven Antwort zu suchen, ohne Erfolg. Also nehme ich an, meine Antwort ist korrekt, aber YMMV und Sie können immer noch auf Probleme stoßen.

Sie müssen den Wert [max_packet_allowed] erhöhen, wenn Sie große BLOB-Spalten oder lange Strings verwenden. Es sollte so groß wie der größte BLOB sein, den Sie verwenden möchten. Das Protokolllimit für max_allowed_packet beträgt 1 GB. Der Wert sollte ein Vielfaches von 1024 sein; Nonmultiples werden abgerundet auf das nächste Vielfache.

Das obige Zitat stammt aus der v5.5 Dokumentation unter https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet.

Von der Aussage, "es sollte so groß sein wie das größte BLOB, das Sie verwenden möchten", I ableiten, dass die max_packet_size auf Spaltengröße basiert, nicht die SQL-Anweisung Größe. Die Größe der Spaltendaten hängt vom Inhalt und der Codierung ab. Überprüfen Sie Ihre Zeichensatz- und Sortierungseinstellungen, um herauszufinden, ob Sie 2 Byte oder 4 Byte pro Zeichen verwenden.

Eine einfache Möglichkeit, um zu überprüfen, ob es sich um die Anweisungsgröße oder die Spaltengröße handelt, ist eine einfache Tabelle mit zwei Textspalten. Angenommen, Ihr max_packet_allowed ist 16M sowohl auf dem Client als auch auf dem Server. Führen Sie eine insert-Anweisung aus, wobei eine der Spalten 8M und die andere Spalte 10M (insgesamt 18M) ist. Wenn die Anweisung nicht ausgeführt werden kann, ist dies die Anweisungsgröße. Wenn es nicht fehlschlägt, können Sie davon ausgehen, dass es auf der Spaltengröße basiert.

Wenn Sie eine Überprüfung der Paketgröße gegen max_packet_allowed implementieren, ist es wichtig, dass BEIDER Server und der Client diesen Wert gesetzt haben. Und was immer niedriger ist, ist das wahre Maximum. Da der Client es einstellen kann, können Sie nicht davon ausgehen, dass sie immer gleich sind.

Ich bin mehr als glücklich, diese Antwort zu bearbeiten, wenn zusätzliche Verweise bereitgestellt werden, um Informationen zu korrigieren. Und wenn ich weit weg von der Basis bin, werde ich gerne die Antwort löschen.

Verwandte Themen