What is the difference between image(SQL Server) and longblob(MySQL)? - php

SQL Server Image Table
CREATE TABLE "SqlServerTable" (
"id" INT NOT NULL,
"image" IMAGE NOT NULL,
PRIMARY KEY ("id")
);
MySQL Image Table
CREATE TABLE `MySqlTable` (
`id` INT NOT NULL,
`image` LONGBLOB NOT NULL,
PRIMARY KEY (`id`)
);
What is the difference between image and longblob?
How can convert data from image type in SQL Server to blob type in MySQL?
When I copy data from SQL Server to MySQL, does not show any image with this
file_put_contents('2xx.jpg',$MySqlTable['image']);?
I have do special processing on image type SQL Server?

BLOB in MySQL
BLOB values are treated as binary strings (byte strings). They have no character set, and sorting and comparison are based on the numeric values of the bytes in column values.
The four BLOB types are TINYBLOB, BLOB, MEDIUMBLOB, and LONGBLOB. These differ only in the maximum length of the values they can hold.
MySQL Connector/ODBC defines BLOB values as LONGVARBINARY.
image
Variable-length binary data from 0 through 2^31-1 (2,147,483,647) bytes.
image data type will be removed in a future version of Microsoft SQL Server. Use varbinary(max) instead.
Microsoft research: To BLOB or Not To BLOB
IMHO, both are a set of binary data and difference is about how each DBMS stores that set of binary data.
I think a better solution to avoid processing over images, streams and so on is to store URL File Links if there is not any advantage of using in table file data.

Related

How to store a blob (image) in MySQL?

I am using php and intervention
What is the db format of a blob?
Is MySQL saving it as base64?
Before I save an image file to db what should I do?
Image::make('......')->encode('data-url');
Is that it?
How to store a Binary Large Object (BLOB)?
A BLOB is a binary large object that can hold a variable amount of
data. The four BLOB types are TINYBLOB, BLOB, MEDIUMBLOB, and
LONGBLOB.
These differ only in the maximum length of the values they can hold.
The four TEXT types are TINYTEXT, TEXT, MEDIUMTEXT, and
LONGTEXT. These correspond to the four BLOB types and have the same
maximum lengths and storage requirements.
Hope the following code will help you:
CREATE TABLE IMAGE_TABLE(
IMG_ID INT(6) NOT NULL AUTO_INCREMENT PRIMARY KEY,
IMG_DETAILS CHAR(50),
IMG_DATA LONGBLOB,
IMG_NAME CHAR(50),
IMG_SIZE CHAR(50),
IMG_TYPE CHAR(50)
);
This will create a table which will suit your requirement.
You may also refer the following SO answers:
Binary Data in MySQL
store TEXT/BLOB in same table or not?
Storing messages as BLOB (Binary Large Object) or ordinary text?
You can refer the official documentation here. This link and this link would be worth a read to deepen your understanding.

How to add photos/video to mysqldatabase without using blob?

I am creating a form that lets users to upload their photos/ video and it will be saved into my database. May I know is there a way to get this done? Im trying to save it in the database using item_path varchar which means it looks. Example: img/cats.jpg . What can I do to make it to be added to the database? Thank you
If you cannot create BLOB column types, then I would use a TEXT type with base64 encoding on the file data. You should take care to record the MIME type of the data and it would probably be a good idea to store a checksum (md5, or similar) as well.
Your files table might look something like this
-- files table
id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY
blob MEDIUMTEXT NOT NULL
mime_type VARCHAR(255) NOT NULL
checksum VARCHAR(255) NOT NULL
created_at DATETIME NOT NULL
You might have other columns that associate the file to a user or any other relevant information
Here are the size limits for the MySQL TEXT column types
TYPE SIZE LIMIT
----------------------------------------------------
TINYTEXT (2^8) 256 bytes
TEXT (2^16) 65,536 bytes (64 KiB)
MEDIUMTEXT (2^24) 16,777,216 bytes (16 MiB)
LONGTEXT (2^32) 4,294,967,296 bytes (4 GiB)
When you write to the DB using PHP, use the base64_encode function to encode the file.
If you cannot create TEXT column types, then you can forget saving the actual data in your database. You will then have to save the files to the filesystem and just store a link to the file in your database.
Or lastly, as another comment points out, you could use an external blob storage like Amazon S3 or other cloud pirate services.

MySQL, which is more efficient longtext, text, or blob? Improving insert efficiency

I am in the process of migrating a large amount of data from several databases into one. As an intermediary step I am copying the data to a file for each data type and source db and then copying it into a large table in my new database.
The structure is simple in the new table, called migrate_data. It consists of an id (primary key), a type_id (incremented within the data type set), data (a field containing a serialized PHP object holding the data I am migrating), source_db (refers to the source database, obviously), data_type (identifies what type of data we are looking at).
I have created keys and key combinations for everything but the data field. Currently I have the data field set as a longtext column. User inserts are taking about 4.8 seconds each on average. I was able to trim that down to 4.3 seconds using DELAY_KEY_WRITE=1 on the table.
What I want to know about is whether or not there is a way to improve the performance even more. Possibly by changing to a different data column type. That is why I ask about the longtext vs text vs blob. Are any of those more efficient for this sort of insert?
Before you answer, let me give you a little more information. I send all of the data to an insert function that takes the object, runs it through serialize, then runs the data insert. It is also being done using Drupal 6 (and its db_query function).
Any efficiency improvements would be awesome.
Current table structure:
CREATE TABLE IF NOT EXISTS `migrate_data` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`type_id` int(10) unsigned NOT NULL DEFAULT '0',
`data` longtext NOT NULL,
`source_db` varchar(128) NOT NULL DEFAULT '',
`data_type` varchar(128) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `migrated_data_source` (`source_db`),
KEY `migrated_data_type_id` (`type_id`),
KEY `migrated_data_data_type` (`data_type`),
KEY `migrated_data_id__source` (`id`,`source_db`),
KEY `migrated_data_type_id__source` (`type_id`,`source_db`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 DELAY_KEY_WRITE=1;
The various text/blob types are all identical in storage requirements in PHP, and perform exactly the same way, except text fields are subject to character set conversion. blob fields are not. In other words, blobs are for when you're storing binary that MUST come out exactly the same as it went in. Text fields are for storing text data that may/can/will be converted from one charset to another.

What is the difference between longblob and longtext in mysql?

What is difference between longblob and longtext in mysql?
What should I use to save a long topic ?
BLOBs are for Binary Large Objects. If you're storing binary data in your DB, then BLOB would be the table type you want. Otherwise.. longtext.
In your case longtext.
BLOB and TEXT are basically identical, except that TEXT fields have character set translation rules applied. BLOB fields do not. So with BLOB what you put in is what you get. With TEXT, what you put may not be what you get out.
You can use collation & character sets on TEXT columns, which would mean that:
If you specify a different charset for a connection than the TEXT column is (for instance,latin1 column, utf-8 requested), MySQL will convert the contents to the required charset.
You can sort & compare TEXT columns based on collation.
BLOB's are just 'binary sequences', and you'll get them 'as is'.

Why is only 64kB of data being saved in my MySQL data column?

I am trying to insert a very long text string into a MySQL Blob column, but MySQL is only saving 64kB of the data. The string is 75360 characters long. I am connecting with PHP's mysql_connect().
Any ideas?
Does it make a difference if it's Blob or Text. I originally had it as a Text but changed it with no affect.
Because that's the maximum size of a BLOB column. You need to use MEDIUMBLOB/LONGBLOB or MEDIUMTEXT/LONGTEXT.
A BLOB type in MySQL can store up to 65,534 bytes, if you try to store more than this much data MySQL will truncate the data. MEDIUMBLOB can store up to 16,777,213 bytes, and LONGBLOB can store up to 4,294,967,292 bytes.
If you enable strict SQL mode (MySQL modes) you will get an error when you try to store data that doesn't fit in the column type.
You also asked if there is a difference between BLOB and TEXT
BLOBS are for binary data. If you do a LIKE query on a BLOB field it will be case sensitive.
i.e.
SELECT 'TEXT' LIKE 'TEXT';
=> 1 for both BLOB and TEXT
SELECT 'TEXT' LIKE 'text';
=> 1 for TEXT
=> 0 for BLOB
The blob column is only 64Kb per the documentation
Try a mediumblob column type instead...

Categories