2011-12-28 26 views
5

Tôi đang đọc dữ liệu nhị phân từ tệp và cố gắng lưu trữ nó trong trường LONGBLOB trong cơ sở dữ liệu MySql.
Tôi đang sử dụng Python và PySide cho việc này.Qt/QSqlQuery: Dữ liệu nhị phân được hiểu là chuỗi khi liên kết với trường BLOB

Vấn đề của tôi là dữ liệu nhị phân được hiểu là một chuỗi, có nghĩa là dữ liệu bị cắt bớt khi một dòng mới xuất hiện trong dữ liệu.

Điều này có vẻ là một vấn đề Python hoặc PySide, bởi vì nếu tôi thêm dữ liệu theo cách thủ công trong dấu nhắc MySql, nó hoạt động hoàn hảo.
Chỉnh sửa: Tôi vừa thử nó với Qt bình thường bằng cách sử dụng C++ và tôi có cùng một vấn đề ở đó.

định nghĩa bảng của tôi là như sau:
CREATE TABLE blobtest (id INT PRIMARY KEY AUTO_INCREMENT, data LONGBLOB NOT NULL;

Dưới đây là một người chép lại.

from PySide.QtSql import QSqlDatabase, QSqlQuery, QSql 

def testit(): 
    db = QSqlDatabase.addDatabase("QMYSQL") 
    db.setHostName("localhost") 
    db.setDatabaseName("testdb") 
    db.setUserName("user") 
    db.setPassword("pass") 
    db.open() 

    query = QSqlQuery(db) 
    data = "start\n\0\n\0\n\0end" 
    query.prepare("INSERT INTO blobtest (data) VALUES(:data)") 
    query.bindValue(":data", data, QSql.In | QSql.Binary) 
    query.exec_() 

    db.close() 

############################################################################### 

if __name__ == "__main__": 
    testit() 

Edit: ở đây là người mô phỏng tương tự trong C++ biến thể của nó. Tôi đang sử dụng QByteArray để giữ dữ liệu, nhưng nó vẫn bị cắt ngắn

#include <QtSql/QtSql> 
#include <QtCore/QByteArray> 

int main(int argc, char* argv[]) { 
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); 
    db.setHostName("localhost"); 
    db.setDatabaseName("testdb"); 
    db.setUserName("user"); 
    db.setPassword("pass"); 
    db.open(); 

    QSqlQuery query = QSqlQuery(db); 
    QByteArray data = QByteArray("start\n\0\n\0\n\0\nend"); 
    query.prepare("INSERT INTO blobtest (data) VALUES(:data)"); 
    query.bindValue(":data", data, QSql::In | QSql::Binary); 
    query.exec(); 

    db.close(); 
    return 0; 
} 

Có ai có ý tưởng tôi có thể làm sai không?

Trả lời

6

Dữ liệu thực sự bị cắt bớt khi tìm thấy ký tự NULL ('\ 0') trong dữ liệu. Trong C++, bạn phải Tạo QByteArray theo cách này:

QByteArray data = QByteArray("start\n\0\n\0\n\0\nend", 15); 

Tôi không biết python nhưng tôi nghĩ rằng bạn phải tạo một QByteArray quá.

+0

Cảm ơn rất nhiều, hoạt động hoàn hảo ngay bây giờ. Điều này cũng chỉ hợp lý - Qt khác nên biết dữ liệu được truyền trong bao lâu, nếu nó không được phép dừng phân tích cú pháp trên \ 0. – Chris

Các vấn đề liên quan