Як зберігати двійкові дані в 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
буде працювати. Вони мають додаткову вигоду від того, що можуть індексувати їх.
Якщо поле - не рекомендується - BLOB існує, ви можете зберегти дані таким чином:
mysql_query("UPDATE table SET field=X'".bin2hex($bin_data)."' WHERE id=$id");
Ідея взята звідси .
Також виникає питання, як отримати дані в BLOB. Ви можете помістити дані в оператор INSERT, як показує приклад PHP (хоча замість додавання слід використовувати mysql_real_escape_string ). Якщо файл існує на сервері баз даних, ви також можете використовувати LOAD_FILE MySQL
Коли мені потрібно зберігати двійкові дані, я завжди використовую VARBINARY
формат, як представлений byd0nut
.
Ви можете знайти документацію на веб-сайті MySQL під задокументованою темою 12.4.2 БІНАРИЙ та ВАРБІНАРНИЙ типи
Якщо ви запитуєте, які переваги, перегляньте питання, чому-варбінарний, а не варчарний