ฉันจะเก็บข้อมูลไบนารีในMySQL ได้อย่างไร
ฉันจะเก็บข้อมูลไบนารีในMySQL ได้อย่างไร
คำตอบ:
คำตอบโดย phpguy นั้นถูกต้อง แต่ฉันคิดว่ามีความสับสนมากมายในรายละเอียดเพิ่มเติมที่นั่น
คำตอบพื้นฐานอยู่ในBLOB
โดเมนชนิดข้อมูล / แอตทริบิวต์ BLOBย่อมาจาก Binary Large Object และชนิดข้อมูลคอลัมน์นั้นมีลักษณะเฉพาะสำหรับการจัดการข้อมูลไบนารี
ดูหน้าคู่มือที่เกี่ยวข้องสำหรับ MySQL
สำหรับตารางเช่นนี้
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)
);
นี่คือตัวอย่าง 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>
ฉันขอแนะนำอย่างยิ่งต่อการจัดเก็บข้อมูลไบนารีในฐานข้อมูลเชิงสัมพันธ์ ฐานข้อมูลเชิงสัมพันธ์ได้รับการออกแบบให้ทำงานกับข้อมูลขนาดคงที่ นั่นคือจุดแข็งของประสิทธิภาพการทำงานของพวกเขา: จำบทความเก่าของโจเอลว่าทำไมฐานข้อมูลถึงรวดเร็วขนาดนี้? เนื่องจากต้องใช้ตัวชี้เพิ่มขึ้น 1 ครั้งเพื่อย้ายจากเร็กคอร์ดไปยังเร็กคอร์ดอื่น หากคุณเพิ่มข้อมูล BLOB ที่ไม่ได้กำหนดและมีขนาดแตกต่างกันอย่างมากมายคุณจะเพิ่มประสิทธิภาพ
ให้เก็บไฟล์ไว้ในระบบไฟล์แทนและเก็บชื่อไฟล์ไว้ในฐานข้อมูลของคุณแทน
ในขณะที่คุณไม่ได้พูดในสิ่งที่คุณกำลังจัดเก็บและคุณอาจมีเหตุผลที่ดีในการทำเช่นนั้นบ่อยครั้งคำตอบก็คือ 'เป็นการอ้างอิงระบบไฟล์' และข้อมูลจริงอยู่บนระบบไฟล์อยู่ที่ไหนซักแห่ง
http://www.onlamp.com/pub/a/onlamp/2002/07/11/MySQLtips.html
ขึ้นอยู่กับข้อมูลที่คุณต้องการจัดเก็บ ตัวอย่างข้างต้นใช้LONGBLOB
ชนิดข้อมูล แต่คุณควรระวังว่ามีรูปแบบข้อมูลไบนารีอื่น ๆ :
TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY
แต่ละคนมีกรณีใช้งาน หากเป็นความยาว (สั้น) ที่ทราบ (เช่นข้อมูลที่บรรจุ) บ่อยครั้งBINARY
หรือVARBINARY
จะใช้งานได้ พวกเขาได้รับประโยชน์เพิ่มเติมจากการที่สามารถทำดัชนีตันได้
แม้ว่ามันไม่จำเป็น แต่คุณสามารถลองbase64
เข้ารหัสข้อมูลและถอดรหัสมันได้ นั่นหมายความว่าฐานข้อมูลจะมีอักขระ ASCII จะใช้พื้นที่และเวลาเพิ่มขึ้นเล็กน้อย แต่ปัญหาใด ๆ ที่เกี่ยวข้องกับข้อมูลไบนารีจะถูกกำจัด
หากฟิลด์- ไม่แนะนำ - มี BLOB อยู่คุณสามารถบันทึกข้อมูลด้วยวิธีนี้:
mysql_query("UPDATE table SET field=X'".bin2hex($bin_data)."' WHERE id=$id");
คำถามก็เกิดขึ้นว่าจะนำข้อมูลเข้าสู่ BLOB ได้อย่างไร คุณสามารถใส่ข้อมูลในคำสั่ง INSERT ได้ตามตัวอย่างของ PHP ที่แสดง (แม้ว่าคุณควรใช้mysql_real_escape_stringแทนที่จะเป็น addlashes) หากไฟล์มีอยู่บนเซิร์ฟเวอร์ฐานข้อมูลคุณสามารถใช้LOAD_FILEของ MySQL ได้เช่นกัน
เมื่อฉันต้องเก็บข้อมูลไบนารีฉันมักจะใช้รูปแบบตามที่แนะนำVARBINARY
byd0nut
คุณสามารถค้นหาเอกสารได้ที่เว็บไซต์ MySQL ภายใต้หัวข้อเอกสาร12.4.2 The BINARY และ VARBINARY Types
หากคุณกำลังถามว่าอะไรคือข้อได้เปรียบโปรดดูคำถามที่ว่าทำไม - varbinary- แทนที่จะเป็น - varchar