【发布时间】:2010-12-19 21:31:36
【问题描述】:
我想确保当用户想要在我的系统(网络应用程序)中注册用户名时,即使不考虑大小写,用户名也是唯一的。因此,如果一个名为“SuperMan”的用户已经注册,则不得允许其他用户注册为“superman”或“SUPERman”。这必须在数据库级别进行检查。
在我当前的实现中,我执行以下操作:
select count(*) from user where lower(name) = lower(?) 进行更新; -- 如果计数大于 0,则错误中止 -- 为用户确定一个新的ID 插入用户(id,name,...)值(?,?,...);我不确定“for update”是否会将数据库锁定得足够远,以致其他用户无法在上述两个 SQL 语句之间使用无效名称进行注册。可能这不是 100% 安全的解决方案。不幸的是,我不能在 SQL 中使用唯一键,因为它们只会区分大小写。
还有其他解决方案吗?以下怎么样,以增加安全性?
select count(*) from user where lower(name) = lower(?) 进行更新; -- 如果计数大于 0,则错误中止 -- 为用户确定一个新的ID 插入用户(id,name,...)值(?,?,...); -- 现在再数一数 select count(*) from user where lower(name) = lower(?); -- 如果计数现在大于 1,请执行以下操作: 从 id = ?; 的用户中删除 -- 或者回滚事务【问题讨论】:
-
说到什么DBMS支持什么,我目前的要求是依次支持MySQL、SQLite和PostgreSQL。不过,其他系统对未来会很好。由于 PostgreSQL 尚不支持这种排序规则(在他们的 TODO 中)并且 SQLite 不能很好地支持 Unicode(A = a,但 Ä != ä),我可能需要另一种解决方案。
标签: sql database unique case-insensitive