我的回答是「什麼是適當的」,而不是「什麼將工作」。
請勿使用latin1
。當然,它可能會起作用,但它聲稱加密的字符串不是文本時是醜陋的。
同上說CHAR...
。
簡單地說如果固定長度是BINARY(...)
或者如果長度可以變化則爲VARBINARY(...)
。
但是,有一個問題...誰使用BCrypt?它是否返回二進制數據?還是一個十六進制字符或者甚至可能是Base64?
我上面的答案假設它返回二進制數據。
如果它返回60個十六進制數字,則將UNHEX(60_hex_digits)
存儲到BINARY(30)
中,以便打包得更小。
如果它是Base64,那麼CHARACTER SET ascii COLLATE ascii_bin
將是「適當的」。 (帶有區分大小寫的排序規則的latin1也可以工作。)
如果它是二進制的,那麼再次,BINARY(60)
是'正確的方法。
您提供的鏈接看起來像Base64,但它是什麼?是高達 60個字符?然後,我會用
VARCHAR(60) CHARACTER SET ascii COLLATE ascii_bin
而且明確規定的字符集/排序爲列,從而覆蓋數據庫和/或表「默認」。
所有Base64字符(和$)都是ascii;不需要更復雜的字符集。與..._bin
整理意味着「完全比較字節」;更具體地說「不要做案例摺疊」。由於Base64取決於區分大寫和小寫字母,因此不需要摺疊大小寫。
據我所知,密碼散列是位流(即二進制),但通常表示爲純文本。你需要存儲什麼格式? –
你的問題很危險地靠近*「難道有人請爲我閱讀關於MySQL數據類型的文檔並做出執行摘要嗎?「* – Tomalak
@ÁlvaroGonzález是的,散列是一串比特,是的,它被編碼爲純文本,但所有這些存儲選項將導致數據庫上不同類型的行爲 – mFeinstein