MySQL + PHP 确保用户名唯一(自动递增后缀)
MySQL + PHP ensure unique username (auto increment suffix)
您好,我正在寻找确保唯一用户名的最有效方法。
我确实已经检查过类似的问题,但 none 个问题让我很高兴。
所以在这里我想出了我的解决方案。感谢您的评论。
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)
为了获得相同用户名的数量,我正在对用户执行以下查询 table(在插入之前)。
SELECT COUNT(*) FROM user WHERE username = 'username'
不幸的是,我无法对 firstname and lastname
使用查找,因为它们区分大小写。
The docs say“非二进制字符串(CHAR、VARCHAR、TEXT),字符串搜索使用比较操作数的排序规则……默认情况下,非二进制字符串比较不区分大小写”,因此您应该能够这样做:
SELECT COUNT(*) FROM user WHERE CONCAT_WS('.', `firstname`, `lastname`) = 'username`
为了避免区分大小写,您可以使用 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' 都会一起计算。
我认为这两种解决方案都不会让优化器利用索引,因此性能可能会下降,但可能不是问题。
您好,我正在寻找确保唯一用户名的最有效方法。 我确实已经检查过类似的问题,但 none 个问题让我很高兴。 所以在这里我想出了我的解决方案。感谢您的评论。
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)
为了获得相同用户名的数量,我正在对用户执行以下查询 table(在插入之前)。
SELECT COUNT(*) FROM user WHERE username = 'username'
不幸的是,我无法对 firstname and lastname
使用查找,因为它们区分大小写。
The docs say“非二进制字符串(CHAR、VARCHAR、TEXT),字符串搜索使用比较操作数的排序规则……默认情况下,非二进制字符串比较不区分大小写”,因此您应该能够这样做:
SELECT COUNT(*) FROM user WHERE CONCAT_WS('.', `firstname`, `lastname`) = 'username`
为了避免区分大小写,您可以使用 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' 都会一起计算。
我认为这两种解决方案都不会让优化器利用索引,因此性能可能会下降,但可能不是问题。