Làm thế nào để lưu một mảng byte vào mysql?
Suốt một tuần vừa qua loay hoay mãi với vấn đề này, search, tìm kiếm, đọc, thử nghiệm và cuối cùng hiểu được một vài thông tin và chia sẽ với các bạn.
Nhưng trước tiên muốn làm rõ hai vấn đề này cái đã đó là hai hàm
pack & unpack
.
Nếu bạn gọi hàm
pack(‘l’,257)
thì kết quả trả về là gì? Không chắc có nhiều người biết về nó. Nếu trên windows (tôi không chắc trên hệ điều hành khác) tôi test được đó là một mảng
byte[4]{0x01,0x01,0x00,0x00};
. Và hàm unpack thì ngược lại. Chúng ta có thể xem mảng byte này như là một chuỗi và thực hiện phép toán cộng chuỗi như thông thường.
Nếu tới một lúc nào đó chúng ta muốn xử lý các file nhị phân, ví dụ hình ảnh thì chắc chắn chúng ta sẽ phải rất quan tâm tới hai hàm này. Và việc hiểu được hai hàm này là tối quan trọng. Lúc đó các bạn sẽ rất bối rối với các khái niệm mà hai hàm pack và unpack đưa ra. Nhưng sau khi tìm hiểu xong sẽ cảm thấy rất thú vị.
Quay trở lại với vấn đề, nếu giả sử bạn có mảng byte thì làm sao để lưu vào.
Bạn phải tổ chức kiểu dữ liệu của column đó là BINARY or VARBINARY, hoặc BLOB. Bạn muốn biết tụi chúng khác nhau thế nào thì đọc tai document của MySQL.
BINARY cho các mảng bé hơn 255 phần tử
VARBINARY thì cho mảng khoảng bé hơn 65k byte gì đó, không nhớ rõ.
BLOB thì dùng cho mấy cái gì đó rất lớn (kiểu như của một file)
Nếu như hàm insert là bình thường thì hàm select ra và xử lý dữ liệu trên nó khá là vất vả. thường thì chúng ta phải truyền vào một chuỗi format để unpack, hơi đuối, với lại chẳng có nhiều lập trình viên thích vậy. Vậy chúng ta phải làm sao để xem chúng như một FILE để có thể seek trên nó giống như thông thường.
Vậy thì chúng ta có thể convert nó thành một mảng byte, bằng hàm
unpack(‘C*’,$data_from_mysl);
sau đó bạn có thể thực hiện thao tác trên đó. Một điều quan trọng giả sử bạn lấy 4byte và muốn convert nó thành một số nguyên thì bạn phải chú ý thứ tự byte của nó lưu trữ thế nào, như ví dụ tôi vừa nói với bạn phía trên với bạn. Có thể bạn làm đúng trên máy ở nhà với windows nhưng lên server linux lại có vấn đề.
Chia sẽ kinh nghiệm này với các bạn.
Ngày cuối tuần vui nhé.