Làm cách nào để lưu trữ dữ liệu nhị phân trong MySQL ?
Làm cách nào để lưu trữ dữ liệu nhị phân trong MySQL ?
Câu trả lời:
Câu trả lời của phpguy là chính xác nhưng tôi nghĩ có rất nhiều nhầm lẫn trong các chi tiết bổ sung ở đó.
Câu trả lời cơ bản là trong một BLOB
miền dữ liệu / thuộc tính. BLOB là viết tắt của Binary Large Object và kiểu dữ liệu cột đó là cụ thể để xử lý dữ liệu nhị phân.
Đối với một bảng như thế này:
CREATE TABLE binary_data (
id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
description CHAR(50),
bin_data LONGBLOB,
filename CHAR(50),
filesize CHAR(50),
filetype CHAR(50)
);
Đây là một ví dụ về PHP:
<?php
// store.php3 - by Florian Dittmer <dittmer@gmx.net>
// Example php script to demonstrate the storing of binary files into
// an sql database. More information can be found at http://www.phpbuilder.com/
?>
<html>
<head><title>Store binary data into SQL Database</title></head>
<body>
<?php
// Code that will be executed if the form has been submitted:
if ($submit) {
// Connect to the database (you may have to adjust
// the hostname, username or password).
mysql_connect("localhost", "root", "password");
mysql_select_db("binary_data");
$data = mysql_real_escape_string(fread(fopen($form_data, "r"), filesize($form_data)));
$result = mysql_query("INSERT INTO binary_data (description, bin_data, filename, filesize, filetype) ".
"VALUES ('$form_description', '$data', '$form_data_name', '$form_data_size', '$form_data_type')");
$id= mysql_insert_id();
print "<p>This file has the following Database ID: <b>$id</b>";
mysql_close();
} else {
// else show the form to submit new data:
?>
<form method="post" action="<?php echo $PHP_SELF; ?>" enctype="multipart/form-data">
File Description:<br>
<input type="text" name="form_description" size="40">
<input type="hidden" name="MAX_FILE_SIZE" value="1000000">
<br>File to upload/store in database:<br>
<input type="file" name="form_data" size="40">
<p><input type="submit" name="submit" value="submit">
</form>
<?php
}
?>
</body>
</html>
Tôi đề nghị chống lại việc lưu trữ dữ liệu nhị phân trong một cơ sở dữ liệu quan hệ. Cơ sở dữ liệu quan hệ được thiết kế để làm việc với dữ liệu kích thước cố định; đó là nơi sức mạnh hiệu suất của họ là: hãy nhớ bài viết cũ của Joel về lý do tại sao cơ sở dữ liệu quá nhanh? bởi vì phải mất chính xác 1 con trỏ để di chuyển từ một bản ghi sang một bản ghi khác. Nếu bạn thêm dữ liệu BLOB có kích thước không xác định và rất khác nhau, bạn sẽ tăng hiệu suất.
Thay vào đó, lưu trữ tệp trong hệ thống tệp và lưu trữ tên tệp trong cơ sở dữ liệu của bạn.
Mặc dù bạn chưa nói những gì bạn đang lưu trữ và bạn có thể có một lý do tuyệt vời để làm như vậy, nhưng câu trả lời thường là "như một tài liệu tham khảo hệ thống tập tin" và dữ liệu thực tế nằm trên hệ thống tập tin ở đâu đó.
http://www.onlamp.com/pub/a/onlamp/2002/07/11/MySQLtips.html
Nó phụ thuộc vào dữ liệu bạn muốn lưu trữ. Ví dụ trên sử dụng LONGBLOB
kiểu dữ liệu, nhưng bạn nên biết rằng có các định dạng dữ liệu nhị phân khác:
TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY
Mỗi có trường hợp sử dụng của họ. Nếu đó là một chiều dài đã biết (ngắn) (ví dụ: dữ liệu được đóng gói) thường xuyên BINARY
hoặc VARBINARY
sẽ hoạt động. Họ có thêm lợi ích của việc có thể tấn chỉ số trên chúng.
Mặc dù không cần thiết, bạn có thể thử base64
mã hóa dữ liệu và giải mã nó. Điều đó có nghĩa là db sẽ chỉ có các ký tự ascii. Sẽ mất thêm một chút không gian và thời gian, nhưng mọi vấn đề liên quan đến dữ liệu nhị phân sẽ được loại bỏ.
Nếu trường - không được đề xuất - BLOB tồn tại, bạn có thể lưu dữ liệu theo cách này:
mysql_query("UPDATE table SET field=X'".bin2hex($bin_data)."' WHERE id=$id");
Ý tưởng lấy từ đây .
Câu hỏi cũng đặt ra làm thế nào để lấy dữ liệu vào BLOB. Bạn có thể đặt dữ liệu vào một câu lệnh INSERT, như ví dụ PHP hiển thị (mặc dù bạn nên sử dụng mysql_real_escape_opes thay vì thêm vào). Nếu tệp tồn tại trên máy chủ cơ sở dữ liệu, bạn cũng có thể sử dụng LOAD_FILE của MySQL
Khi tôi cần lưu trữ dữ liệu nhị phân, tôi luôn sử dụng VARBINARY
định dạng, như đã giới thiệu byd0nut
.
Bạn có thể tìm tài liệu tại trang web MySQL theo chủ đề tài liệu 12.4.2 Các loại BINary và VARBINARY
Nếu bạn đang hỏi lợi thế là gì, xin vui lòng xem câu hỏi tại sao-varbinary-thay-of-varchar