原因:
我有一个表,列都适当地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上的字符集和排序规则是否对标准比较区分大小写?[是]
我想做什么就做什么。我应该换一套吗?如果是,为什么?
在MySQL
UTF8mb4_bin
列中存储UTF8mb4_bin
输出是否有问题?这种方法是否方便地避开了编辑每个登录查询的查询SQL的需要?我可以更改列类型然后继续吗?
编辑
如njú所述,这是一个愚蠢的问题,根本不是问题,因为登录时从未直接编辑
password_hash
的值。... 这是漫长的一天。
最佳答案
如果您真的很担心62^55地址空间中可能会发生2^55冲突,您只需将列类型更改为BLOB,这总是区分大小写的。
CREATE TABLE IF NOT EXISTS `users` (
`user_id` int(8) NOT NULL AUTO_INCREMENT,
`username` varchar(100) NOT NULL,
`pass_word` BLOB NOT NULL ,
...etc etc...
PRIMARY KEY (`user_id`),
UNIQUE KEY `email_addr` (`email_addr`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=989 ;
例子:
INSERT INTO `users` (..., `pass_word`) VALUES (..., 'AbC');
SELECT * FROM `users` WHERE `pass_word` = 'AbC' LIMIT 0,1000;
->1次击中SELECT * FROM `users` WHERE `pass_word` = 'abc' LIMIT 0,1000;
->0次点击关于mysql - MySQL区分大小写(否则,如何在MySQL中正确存储密码),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36314130/