原因:
我有一个表,列都适当地Collatedutf8mb4_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上的字符集和排序规则是否对标准比较区分大小写?[是]
我想做什么就做什么。我应该换一套吗?如果是,为什么?
在MySQLUTF8mb4_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/

10-12 16:09