原因:
私はテーブルを持っており、列はすべて適切Collated
にutf8mb4_unicode_ci
、
CREATE TABLE IF NOT EXISTS `users` (
`user_id` int(8) NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
`pass_word` varchar(512) NOT NULL ,
...etc etc...
PRIMARY KEY (`user_id`),
UNIQUE KEY `email_addr` (`email_addr`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=989 ;
...などのパスワード ハッシュ (から生成password_hash
)を格納する列を含めます$2y$14$tFpExwd2TXm43Bd20P4nkMbL1XKxwF.VCpL.FXeVRaUO3FFxGJ4Di
。
しかし、列の大文字と小文字が区別されないため、のハッシュでもアクセスが許可されることがわかりました$2y$14$tFpExwd2tXm43Bd20P4NKmbL1XKxwF.VCpL.FxEVRaUO3FFxGJ4DI
。
これは、大文字と小文字を区別しない方法でデータを格納することにより、潜在的に数百の衝突が発生する可能性があることを意味します。良くない。
問題:
さて、比較を行うときに、 MySQL に列を大文字と小文字pass_word
を区別する列として扱うよう強制する方法はありますか。PHP/SQL クエリが発生するたびに編集する必要はなく、代わりにデータベース テーブル列をデフォルトで大文字と小文字を区別して比較するように設定するだけです。
utf8mb4
文字セットにはオプションがありません。_cs
唯一の非_ci
オプションはutf8mb4_bin
.
とても簡単な質問:
MySQLの[はい]UTF8mb4_bin
文字セットと照合は、標準比較を大文字と小文字を区別して処理しますか?UTF8mb4_bin
私がやりたいことをスーツに投与します。別のセットを使用する必要がありますか? その場合、その理由は?password_hash
出力を MySQLutf8mb4_bin
列に保存する際に問題はありますか?- このアプローチは、各ログイン クエリのクエリ SQL を編集する必要性を便利に回避しますか? 列のタイプを変更して次に進むことはできますか?
編集
nj_ で詳しく説明されているように、
pass_word
ログイン時に の値が直接編集されることはないため、これはまったく問題にならないばかげた問題です。 ... 長い 1 日でした。