回答:
VARCHAR
可変長データに使用しますが、固定長データには使用しません。SHA-1値は常に 160ビット長であるため、固定長フィールドの長さのために追加のバイトがVARCHAR
無駄になるだけです。
また、返される値も保存しませんSHA1
。文字あたり4ビットしか使用しないため、160/4 = 40文字が必要になるためです。ただし、1文字あたり8ビットを使用する場合、必要なのは160/8 = 20文字の長さのフィールドだけです。
使用することをお勧めします私はそうBINARY(20)
とUNHEX
機能変換するために、SHA1
バイナリに値を。
とのストレージ要件を比較BINARY(20)
しましたCHAR(40)
。
CREATE TABLE `binary` (
`id` int unsigned auto_increment primary key,
`password` binary(20) not null
);
CREATE TABLE `char` (
`id` int unsigned auto_increment primary key,
`password` char(40) not null
);
何百万ものレコードbinary(20)
があると、44.56M char(40)
かかりますが、64.57Mかかります。
InnoDB
エンジン。
UNHEX()
手動でSQLに追加した場合にのみ機能します。
以下は、ハッシュアルゴリズムと必要なビットサイズのリストです。
require CHAR(n)で1つのサンプルテーブルを作成しました:
CREATE TABLE tbl_PasswordDataType
(
ID INTEGER
,MD5_128_bit CHAR(32)
,SHA_160_bit CHAR(40)
,SHA_224_bit CHAR(56)
,SHA_256_bit CHAR(64)
,SHA_384_bit CHAR(96)
,SHA_512_bit CHAR(128)
);
INSERT INTO tbl_PasswordDataType
VALUES
(
1
,MD5('SamplePass_WithAddedSalt')
,SHA1('SamplePass_WithAddedSalt')
,SHA2('SamplePass_WithAddedSalt',224)
,SHA2('SamplePass_WithAddedSalt',256)
,SHA2('SamplePass_WithAddedSalt',384)
,SHA2('SamplePass_WithAddedSalt',512)
);
sha1の出力サイズは160ビットです。160/8 == 20文字(8ビット文字を使用する場合)または160/16 = 10(16ビット文字を使用する場合)です。
sha1列のインデックスが必要な場合は、パフォーマンス上の理由からCHAR(40)をお勧めします。私の場合、sha1列は電子メールの確認トークンなので、ランディングページでは、クエリはトークンのみで入力します。この場合、私の考えでは、INDEXを指定したCHAR(40)が最良の選択です。
この方法を採用する場合は、$ raw_output = falseのままにしてください。