在MySQL中使用BLOB或VARBINARY加密数据?

在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列的尾随空间

我正在开发一个PHP应用程序,它通过文本区域接受用户输入。它将加密存储在数据库中(使用AES_ENCRYPT)


我应该使用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中删除的