For the sake of simplicity, suppose I'm developing a mobile app like Instagram. Users can download images from the server, and upload images of their own. Currently the server stores all images (in reality, just small thumbnails) in a MySQL database as BLOBs. It seems that the most common way to transfer images is by using Base64 encoding, which leaves me with two options:
Clearly, option #1 requires significantly more processing on the server, as images must be encoded/decoded with every single request. This makes me lean toward option #2, but some research has suggested that storing Base64 string in MySQL is much less efficient than storing the image directly as BLOB, and is generally discouraged.
I'm certainly not the first person to encounter this situation, so does anybody have suggestions on the best way to make this work?
JSON assumes utf8, hence is incompatible with images unless they are encoded in some way.
Base64 is almost exactly 8/6 times as bulky as binary (BLOB). One could argue that it is easily affordable. 3000 bytes
becomes about 4000 bytes
.
Everyone should be able to accept arbitrary 8-bit codes, but not everybody does. Base-64 may be the simplest and overall best compromise for not having to deal with 8-bit data.
Since these are "small", I would store them in a table, not a file. I would, however, store them in a separate table and JOIN
by an appropriate id
when you need them. This allows queries that don't need the image to run faster because they are not stepping over the BLOBs.
Technically, TEXT CHARACTER SET ascii COLLATE ascii_bin
would do, but BLOB
makes it clearer that there is not really any usable text in the column.