所以我正在使用一个将图像存储在数据库中的应用程序.你对此有何看法?我更像是一种在文件系统中存储位置的类型,而不是直接将它存储在数据库中.
您认为利弊是什么?
请看一下这张表:
http://www.mediawiki.org/wiki/Manual:Logging_table
正如你可以看到维基百科使用varbinary而不是varchar:
| log_type | **varbinary**(32) | NO | MUL | |
| log_action | **varbinary**(32) | NO | | |
| log_timestamp | **binary**(14) | NO | MUL | 19700101000000 |
| log_user | int(10) unsigned | NO | MUL | 0 |
| log_user_text | **varbinary**(255) | | | |
Run Code Online (Sandbox Code Playgroud)
所有这些信息都是文本,为什么他们将它们保存为二进制?
他们为所有表格执行此操作.
我听说有传言说在将二进制数据(文件等)插入MySQL时,你应该使用该bin2hex()函数并将其作为HEX编码值发送,而不是仅仅使用mysql_real_escape_string二进制字符串并使用它.
// That you should do
$hex = bin2hex($raw_bin);
$sql = "INSERT INTO `table`(`file`) VALUES (X'{$hex}')";
// Rather than
$bin = mysql_real_escape_string($raw_bin);
$sql = "INSERT INTO `table`(`file`) VALUES ('{$bin}')";
Run Code Online (Sandbox Code Playgroud)
据说这是出于性能原因.与MySQL如何处理大字符串以及如何处理HEX编码值有关
但是,我很难确认这一点.我所有的测试都表明确切的对话; 该bin2hex方法慢了约85%,使用了大约24%的内存.
(我在PHP 5.3,MySQL 5.1,Win7 x64上测试它 - 使用一个简单的插入循环.)
例如,此图显示了测试代码运行时mysqld进程的私有内存使用情况:
mysqld进程使用的私有字节http://atli.advefir.com/images/priv_mem_cropped.gif
有没有人有解释这个的解释或资源?
谢谢.
我在本地计算机上有一个PDF文件.我想将此文件上传到SQL数据库上的BINARY BLOB.这里提到的其他方法[ MySQL中的二进制数据都使用PHP.我想要一个简单干净的方法来在Linux命令行上传这个PDF文件.不幸的是,我无法访问远程文件系统,因此无法像其他地方那样只存储文件的链接......我需要将这个MySQL数据库用作这些PDF文件的虚拟文件系统.
从PhP示例中,似乎所有需要的是在使用INSERT命令之前转义斜杠?有一种简单的方法可以在Linux命令行上实现吗?
我有一条信息,使用aes-256-cbc加密编码.我该如何将其存储在数据库中?目前我正在使用VARCHAR(255)utf8_bin.这样可以,还是应该使用其他字段类型,如VARBINARY(255)?在这种情况下,是否有可能使用VARCHAR丢失一些数据?谢谢.
我用这个函数来哈希我的密码:
// RETURNS: rAyZOnlNBxO2WA53z2rAtFlhdS+M7kec9hskSCpeL6j+WwcuUvfFbpFJUtHvv7ji
base64_encode(hash_hmac('sha384', $str . SC_NONCE, SC_SITEKEY, true));
Run Code Online (Sandbox Code Playgroud)
我在char(64)字段(MySQL -InnoDB)中存储哈希值.
我应该使用varchar(64)而不是char(64)吗?为什么?
编辑: 我用sha384更改了sha256.因为在这个例子中,sha256总是为我返回44个字节.抱歉令人困惑.现在它是64字节.