我正在研究一個接受用戶通過文本區域輸入的PHP應用程序。它將被加密存儲在數據庫中(使用AES_ENCRYPT)。在BLOB或VARBINARY中使用MySQL中的加密數據?
我應該使用BLOB還是VARBINARY字段?對任何一種領域都有性能影響?
我正在研究一個接受用戶通過文本區域輸入的PHP應用程序。它將被加密存儲在數據庫中(使用AES_ENCRYPT)。在BLOB或VARBINARY中使用MySQL中的加密數據?
我應該使用BLOB還是VARBINARY字段?對任何一種領域都有性能影響?
兩個BLOB和VARBINARY是「字符串」的數據類型,該存儲二進制字符串(有效字節數組),而不是通常的字符串類型,其存儲字符的字符串,字符集編碼等
在大多數方面,您可以將BLOB列視爲VARBINARY列,可以儘可能大。
BLOB從VARBINARY不同之處在於以下方面:
使用BLOB,因爲如果你的加密值發生在一個空間字節(十六進制20)結束,將它與VARBINARY截斷,有效地破壞你的價值。另外,您不會將索引放在加密值上,因此索引問題並不重要,也不會有默認值。
根據我對[doc](https://dev.mysql.com/doc/refman/5.0/en/binary-varbinary.html)的理解,尾部空格不會從VARBINARY – fgrieu
我不認爲波希米亞的答案是準確的。 像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)
中刪除[Bohemian的回答](http://stackoverflow.com/a/15982551/903600)中隱含的斷言是_trailing_空格從VARBINARY中刪除。這個斷言在[doc](https://dev.mysql.com/doc/refman/5.0/en/binary-varbinary.html)的基礎上似乎是錯誤的,但不會被所示的測試所反駁。 – fgrieu
謝謝@fgrieu - 剛剛編輯我的示例。 – elousf
@elsouf:所以你的(精煉)實驗和[文檔](https://dev.mysql.com/doc/refman/5.0/en/binary-varbinary.html)確認[波希米亞人的回答]中的建議( http://stackoverflow.com/a/15982551/903600)是基於***錯誤***的前提,在MySQL中,尾隨空格從VARBINARY中刪除。 – fgrieu
AES_ENCRYPT()和AES_DECRYPT()使加密和使用官方AES(高級加密標準)算法,以前已知爲具有128位密鑰長度「的Rijndael。」編碼的數據進行解密時使用,但你可以通過修改源將其擴展到256位。我們選擇了128位,因爲它速度更快,而且對於大多數目的而言它足夠安全。 http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html#function_aes-encrypt – zod
http://stackoverflow.com/questions/504268/mysql-binary-against-non-binary- for-hash-id – zod