2011-12-12 85 views
18

Tôi có khoảng 2k dữ liệu nhị phân thô mà tôi cần lưu trữ trong một bảng, nhưng không biết có nên chọn loại Varbinary hoặc Blob hay không. Tôi đã đọc qua các mô tả trong tài liệu MySQL nhưng không tìm thấy bất kỳ hợp đồng nào và so sánh các mô tả. Tôi cũng đọc rằng varbinary chỉ hỗ trợ lên đến 255 ký tự, nhưng tôi đã tạo thành công trường varbinary (2048), vì vậy tôi hơi bối rối.Varbinary vs Blob trong MySQL

Dữ liệu nhị phân không cần được lập chỉ mục, cũng như tôi sẽ không cần truy vấn trên đó. Có một lợi thế để sử dụng một loại trên khác từ PHP?

Cảm ơn!

+0

Điều này có thể là lý do tại sao tôi nhận được 'org.hibernate.HibernateException: Loại cột sai trong ... cho cột .... Tìm thấy: blob, expected: longblob' –

Trả lời

11

VARBINARY bị ràng buộc với 255 byte trên MySQL 5.0.2 trở xuống, đến 65kB trên 5.0.3 trở lên.

BLOB bị ràng buộc với 65kB.

Cuối cùng, VARBINARY hầu như giống như BLOB (từ quan điểm của những gì có thể được lưu trữ trong đó), trừ khi bạn muốn duy trì khả năng tương thích với các phiên bản "cũ" của MySQL. Các MySQL Documentation nói:

Trong hầu hết các khía cạnh, bạn có thể xem một cột BLOB như một cột VARBINARY đó có thể là lớn như bạn muốn.

+0

Re" varbinary hầu như giống như blob "... xin trích dẫn một nguồn. – Pacerier

+0

@Pacerier: Câu trả lời đã chỉnh sửa để bao gồm liên kết tới trang Tài liệu MySQL (sic) gợi ý về thực tế này. – Romain

+0

Nhưng như được hiển thị bởi các bài viết khác dưới đây, họ thực sự là những điều rất khác nhau hoàn toàn. – Pacerier

12

Trên thực tế blob có thể lớn hơn (có tinyblob, blob, mediumblob & longblob http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html) lên đến 2^32 -1 trên giới hạn kích thước.

Bộ nhớ blob cũng tăng "bên ngoài" của hàng, trong khi kích thước tối đa varbinary được gắn liền với số lượng hàng có sẵn miễn phí (vì vậy nó thực sự có thể nhỏ hơn 64Kb).

Có một số khác biệt nhỏ giữa hai 1) Với Index scripting (blob cần một kích thước tiền tố trên chỉ số, varbinary không) http: /en/column-indexes.html
CREATE TABLE thử nghiệm (blob_col BLOB , INDEX (blob_col (10)));

2) Như đã đề cập có trailling vấn đề không gian quản lý khác nhau giữa varbinary & blob tại MySql 5.0.x hoặc phiên bản trước: http: ///en/blob.html http: /// en/binary- varbinary.html

(cắt bỏ các liên kết, kể từ stackoverflow nghĩ quá nhiều liên kết là thư rác)

+1

Vì vậy, khi chúng ta có chỉ là một cột 2KB là nó có lợi hơn để sử dụng blob (ngoài hàng) hoặc varbinary (trong hàng)? – Pacerier

9

Một khác biệt đáng kể là loại blob được lưu trữ trong lưu trữ thứ cấp, trong khi varbinaries được lưu trữ nội tuyến trong hàng trong cùng một cách như varchars và các loại "đơn giản" khác.

Điều này có thể có tác động đến hiệu suất trong hệ thống bận, nơi tìm kiếm bổ sung để tìm nạp và thao tác dữ liệu blob có thể tốn kém.

+0

Điều này có đúng với 5.0.3 trở lên không? – Pacerier

0

Tôi chỉ đang xem xét một ứng dụng thử nghiệm lưu trữ khoảng 5k dữ liệu nhị phân trong một cột. Ban đầu nó được sử dụng varbinary nhưng vì nó quá chậm nên tôi quyết định thử blob. Tôi đang nhìn vào tốc độ ghi đĩa với trên đỉnh và không thể thấy bất kỳ sự khác biệt nào.

Sự khác biệt đáng kể duy nhất tôi đọc trong hướng dẫn mysql là các đốm trắng không được hỗ trợ bởi bộ nhớ nên bất kỳ bảng tạm thời nào bạn tạo bằng truy vấn (xem khi nào mysql uses temp tables) sẽ được tạo trên đĩa và chậm hơn nhiều. Vì vậy, bạn đặt cược tốt hơn trên varbinary/binary nếu nó đủ ngắn để vừa với một hàng (tại thời điểm 64k tổng cho tất cả các cột).

5

Điều đáng nói là bộ nhớ lưu trữ không hỗ trợ BLOB/TEXT nhưng nó hoạt động với VARBINARY.