Hi,
ich möchte mit QtSQL (vorzugsweise sqlite / mysql) eine größere Menge
float-Daten speichern, die später weiterverarbeitet werden sollen.
Mich stört die doppelte Wandlung von float in ASCII - aus Rechenzeit-
und vor allem Genauigkeitsgründen.
Für das speichern mit insert funktioniert das mit preallocated statements:
query.prepare
query.bindValue
query.exec()
Wie stelle ich das bei der Abfrage mit select an?
Ich habe das Beispiel von hier
https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html
versucht.
void test_preallocated_statement (QSqlDatabase &db)
{
QSqlQuery query;
if (!query.exec("SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2))
AS hypotenuse';PREPARE stmt2 FROM @s;SET @a = 6; SET @b = 9;"))
{
LOG_FAILED_QUERY(query);
//return
}
if (!query.exec("EXECUTE stmt2 USING @a, @b;"))
{
LOG_FAILED_QUERY(query);
//return
}
QSqlRecord record = query.record();
qDebug() << "Number of columns: " << record.count();
while (query.next())
{
QString line = query.value(0).toString();
qDebug() << "result from mysql: " << line;
}
if (!query.exec("DEALLOCATE PREPARE stmt2;"))
{
LOG_FAILED_QUERY(query);
}
}
und mit dem wireshark kontrolliert, was übertragen wird:
Frame 1552: 145 bytes on wire (1160 bits), 145 bytes captured
(1160 bits) on interface 0
Transmission Control Protocol, Src Port: mysql (3306), Dst Port:
59928 (59928), Seq: 157, Ack: 240, Len: 79
MySQL Protocol
Packet Length: 1
Packet Number: 1
Number of fields: 1
MySQL Protocol
Packet Length: 32
Packet Number: 2
Catalog: def
Database:
Table:
Original table:
Name: hypotenuse
Original name:
Charset number: binary COLLATE binary (63)
Length: 23
Type: FIELD_TYPE_DOUBLE (5)
Flags: 0x0080
Decimals: 31
MySQL Protocol
Packet Length: 5
Packet Number: 3
EOF marker: 254
Warnings: 0
Server Status: 0x0002
MySQL Protocol
Packet Length: 16
Packet Number: 4
text: 10.816653826392
MySQL Protocol
Packet Length: 5
Packet Number: 5
EOF marker: 254
Warnings: 0
Server Status: 0x0002
Das Ergebnis sind nicht 4 (8) byte sondern 16 - ASCII codiert.
Hat jemand eine Idee?
Würde sich sqlite anders verhalten?
Gruß,
Jan