5

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

我应该使用 BLOB 还是 VARBINARY 字段?任何一种类型的字段都对性能有影响吗?

4

2 回答 2

13

BLOB 和 VARBINARY 都是“字符串”数据类型,它们存储二进制字符串(实际上是字节数组),而不是通常的字符串类型,它存储字符串,具有字符集编码等。

在大多数方面,您可以将 BLOB 列视为 VARBINARY 列,可以任意大。

BLOB 在以下方面与 VARBINARY 不同:

  • 存储或检索值时,不会删除 BLOB 列的尾随空格。
  • 对于 BLOB 列上的索引,您必须指定索引前缀长度。
  • BLOB 列不能有 DEFAULT 值。

使用 BLOB,因为如果您的加密值恰好以空格字节(十六进制 20)结尾,它将被 VARBINARY 截断,从而有效地破坏您的值。此外,您不会在加密值上放置索引,因此索引问题无关紧要,您也不会有默认值。

于 2013-04-12T23:43:26.027 回答
3

我不认为波西米亚的回答是准确的。类似于 BLOB 的 VARBINARY 是存储二进制数据,因此它能够存储包括空格在内的任何数据。

    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)
于 2014-08-15T18:26:12.217 回答