在MySQL中使用BLOB或VARBINARY加密数据?
我正在开发一个PHP应用程序,它通过文本区域接受用户输入。它将加密存储在数据库中(使用AES_ENCRYPT)在MySQL中使用BLOB或VARBINARY加密数据?,mysql,database-design,schema,relational-database,Mysql,Database Design,Schema,Relational Database,我正在开发一个PHP应用程序,它通过文本区域接受用户输入。它将加密存储在数据库中(使用AES_ENCRYPT) 我应该使用BLOB还是VARBINARY字段?这两种类型的字段都有性能影响吗?BLOB和VARBINARY都是“字符串”数据类型,它们存储二进制字符串(有效地是字节数组),而通常的字符串类型使用字符集编码等存储字符串 在大多数情况下,您可以将BLOB列视为VARBINARY列,该列可以任意大 BLOB与VARBINARY的不同之处在于: 存储或检索值时,不会删除BLOB列的尾随空间
我应该使用BLOB还是VARBINARY字段?这两种类型的字段都有性能影响吗?BLOB和VARBINARY都是“字符串”数据类型,它们存储二进制字符串(有效地是字节数组),而通常的字符串类型使用字符集编码等存储字符串 在大多数情况下,您可以将BLOB列视为VARBINARY列,该列可以任意大 BLOB与VARBINARY的不同之处在于:
- 存储或检索值时,不会删除BLOB列的尾随空间
- 对于BLOB列上的索引,必须指定索引前缀长度
- BLOB列不能具有默认值
使用BLOB,因为如果加密的值恰好以空格字节(十六进制20)结尾,它将被VARBINARY截断,从而有效地破坏您的值。此外,您不会在加密值上添加索引,因此索引问题无关紧要,您也不会有默认值。我认为波希米亚的答案不准确。 VARBINARY-like BLOB用于存储二进制数据,因此它能够存储任何数据,包括空间
mysql> create table t1 (id integer auto_increment, data varbinary(100), primary key (id));
Query OK, 0 rows affected (0.09 sec)
// inserting '0', ' ', '0', ' ' - 4 characters including trailing space
mysql> insert into t1 (data) values (unhex('30203020'));
Query OK, 1 row affected (0.02 sec)
+----+------+
| id | data |
+----+------+
| 1 | 0 0 |
+----+------+
1 row in set (0.00 sec)
mysql> select t1.*, length(data) from t1;
+----+------+--------------+
| id | data | length(data) |
+----+------+--------------+
| 1 | 0 0 | 4 |
+----+------+--------------+
1 row in set (0.00 sec)
AES_ENCRYPT()和AES_DECRYPT()可以使用官方AES(高级加密标准)算法(以前称为“Rijndael”)对数据进行加密和解密。可以使用128位密钥长度的编码,但可以通过修改源代码将其扩展到256位。我们选择128位是因为它速度快得多,而且对于大多数用途来说都足够安全。中隐含的断言是从VARBINARY中删除尾随空格。根据所示的测试,我认为该断言似乎是错误的。@elsouf:因此,您的(改进的)实验并确认advice in基于一个错误的前提,即在MySQL中,尾随空格是从VARBINARY中删除的。根据我对的理解,尾随空格不是从VARBINARY中删除的