【问题标题】:MySQL + PHP ensure unique username (auto increment suffix)MySQL + PHP 确保用户名唯一(自增后缀)
【发布时间】:2015-05-06 19:05:45
【问题描述】:

您好,我正在寻找最有效的方式来确保用户名的唯一性。 我确实已经检查了类似的问题,但没有一个让我感到高兴。 所以在这里我想出了我的解决方案。我很感激你的cmets。

CREATE TABLE IF NOT EXISTS `user` (
`guid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

`firstname` varchar(48) NOT NULL,
`lastname` varchar(48) NOT NULL,
`username` varchar(128) NOT NULL,
`unique_username` varchar(128) NOT NULL,


PRIMARY KEY (`guid`),
KEY `firstname` (`firstname`),
KEY `lastname` (`lastname`),
KEY `username` (`username`),
UNIQUE KEY `unique_username` (`unique_username`),
UNIQUE KEY `email` (`email`)


) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

username 包含 firstname.lastname 没有数字后缀,而 unique_username 包含 firstname.lastname.(count of equal usernames)

为了获得相同用户名的计数,我正在对用户表执行以下查询(在插入之前)。

SELECT COUNT(*) FROM user WHERE username = 'username'

很遗憾,我无法对 firstname and lastname 使用查找功能,因为它们区分大小写。

【问题讨论】:

  • 时间戳 (yyyyMMddhhss) + 姓氏作为唯一用户名怎么样?
  • 谢谢。我更喜欢 Facebook 的方式(在末尾添加一个数字)。由于用户名可以在 google 中找到。

标签: mysql unique


【解决方案1】:

The docs say“非二进制字符串(CHAR、VARCHAR、TEXT),字符串搜索使用比较操作数的排序规则……默认情况下,非二进制字符串比较不区分大小写”,所以你应该可以这样做:

SELECT COUNT(*) FROM user WHERE CONCAT_WS('.', `firstname`, `lastname`) = 'username`

【讨论】:

  • 谢谢。我已将我的查询更新为:select count(*) as 'count' from user where firstname = '$firstname' and lastname = '$lastname' 并且可以正常工作。性能怎么样? 100 万行?
  • firstnamelastname 都是键,所以你应该没问题。
【解决方案2】:

要绕过区分大小写,您可以使用 LCASE(column) 来比较小写值:

SELECT COUNT(*) FROM user 
WHERE LCASE(lastname) = LCASE('Lastname') 
  AND LCASE(firstname) = LCASE('firstName');

您也可以使用 LIKE 来检查用户名字段:

SELECT COUNT(*) FROM user WHERE username LIKE 'username%';

这样 'this.name'、'this.name.1' 和 'this.name.2' 将一起计算。

我认为这两种解决方案都不会让优化器利用索引,因此性能可能会下降,但可能不是问题。

【讨论】:

  • 谢谢。我想使用 LCASE 确实会对性能产生影响。但无论如何,Honore Doktorr 解决方案正在解决小写问题。
猜你喜欢
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 2016-09-27
相关资源
最近更新 更多