2013-09-27 82 views
6

我有一個PHP應用程序,它存儲所有帳戶,無論它們是否活動或不在一個表中。該表有一個名爲「active」的列,該列的值爲NULL,表示該帳戶處於活動狀態,或者包含MD5散列,這意味着帳戶處於非活動狀態。最好的MySQL數據類型來存儲MD5散列或NULL

根據Best practices for efficiently storing md5 hashes in mysql,如果該列始終包含MD5散列並且從不爲NULL,那麼BINARY(16)是首選,而CHAR(32)是下一個最佳選擇。由於我的大多數帳戶都是活動的,因此大多數列值將爲NULL,我最好使用不同的數據類型,例如VARCHAR(32)?

+1

是的,你可以......'VARCHAR(32)'是可取的。 –

+0

可能重複[MySQL:什麼數據類型用於散列密碼字段和多長?](http://stackoverflow.com/questions/247304/mysql-what-data-type-to-use-for-hashed-密碼字段和什麼長度) –

回答

12

使用VARCHAR沒有意義。 MD5散列總是128位,所以CHAR(32)保存十六進制數字串,或者BINARY(16)保存UNHEX()後的字節串。

使用NULL與數據類型選擇無關。 MySQL可以存儲NULL來代替CHAR或VARCHAR的字符串。但實際上,在InnoDB的默認行格式中,MySQL根本不存儲NULL,它不存儲任何空值的列。


參考:http://dev.mysql.com/doc/internals/en/innodb-field-contents.html

  • 有用事項有關空值:

    對於第三排,我在FIELD2和FIELD3插入空值。因此,在字段起始偏移量中,這些字段的最高位開啓(值爲94十六進制,94十六進制,而不是14十六進制,14十六進制)。 由於NULL不佔用空間,所以行較短。

(重點煤礦)

+0

感謝比爾,所以根據你的答案,我明白,如果我使用CHAR(32)或二進制(16),並且存儲值爲NULL,那麼我的開銷不會超過使用VARCHAR(32)。謝謝,我希望你是對的! – user1032531

+0

+1 Bill和@ user1032531 Bill意味着您應該使用CHAR(32)或BINARY(16)。而且當您使用VARCHAR時,您的開銷會更大,因爲MySQL需要額外保存兩條短褲才能知道您的VARCHAR有多大。在定義ascii_bin字符集時,確切的查找鍵應該在CHAR列上更快。 –

0

在文件strings/ctype-bin.c中的MySQL源代碼中定義了BINARY類型。

這看起來像默認的基於ASCII ASCII的字符集轉換成二進制。這應該比使用ascii_bin字符集的CHAR(32)更快。

因爲更少的時間是需要的讀/寫的二進制文件,它需要較少的磁盤空間的索引和存儲,並因爲CHAR(32)數據類型爲16個字節的

如果你想用這個你應該使用這個php代碼

<?php 
    md5 ("password", true); // true returns the binary what is 16 bytes long MySQl BINARY(16) 
?> 
-5

您可以使用PHP函數MD5(); 效率更高,並且如果任何人在發送到數據庫時都可以捕獲數據,則該數據已經被加密。

+2

這是如何回答這個問題的? – mistika

相關問題