第一个字母为大写的SQL约束

第一个字母为大写的SQL约束,sql,constraints,Sql,Constraints,我很好奇为什么我的约束不起作用?第一次尝试编写约束时,请在这里耐心听我说。如果您使用的是MySQL,它不会工作,因为约束没有强制执行。在其他一些数据库中,=的默认排序规则的大小写相同。而且,无论默认排序规则是什么,都可能会为您的数据库更改它 有一种方法可以轻松做到这一点: ALTER TABLE info ADD CONSTRAINT uppercase CHECK (password = UPPER(substr(password, 1 ,1 ))); 也就是说,在大多数情况下,密码不应该

我很好奇为什么我的约束不起作用?第一次尝试编写约束时,请在这里耐心听我说。

如果您使用的是MySQL,它不会工作,因为约束没有强制执行。在其他一些数据库中,
=
的默认排序规则的大小写相同。而且,无论默认排序规则是什么,都可能会为您的数据库更改它

有一种方法可以轻松做到这一点:

ALTER TABLE info
ADD CONSTRAINT uppercase 
CHECK (password = UPPER(substr(password, 1 ,1 )));

也就是说,在大多数情况下,密码不应该以未加密的方式存储在数据库中。这是非常危险的。您可以在数据库层加密密码。我认为在客户端层进行加密更好,因此免费文本密码在网络上根本不存在。

如果您使用的是MySQL,它就不起作用,因为没有强制执行约束。在其他一些数据库中,
=
的默认排序规则的大小写相同。而且,无论默认排序规则是什么,都可能会为您的数据库更改它

有一种方法可以轻松做到这一点:

ALTER TABLE info
ADD CONSTRAINT uppercase 
CHECK (password = UPPER(substr(password, 1 ,1 )));

也就是说,在大多数情况下,密码不应该以未加密的方式存储在数据库中。这是非常危险的。您可以在数据库层加密密码。我认为在客户端层进行加密更好,因此免费文本密码甚至不能在网络上使用。

明显的问题是,将一个字符与整个字符串进行比较,这仅适用于单个字符的字符串。什么是RDBMS?您正在使用哪些区分大小写和/或排序选项?为什么要将密码存储在纯文本中,并强制要求密码以大写字母开头?不相关,但如果密码的第一个字母对您很重要,那么您似乎没有加密或散列您的密码。你应该是。最好是对你的密码进行哈希(和盐渍)运算。我算出来了。这是一个很好的问题,请记住永远不要存储密码。您使用的是哪种DBMS?明显的问题是,您将1个字符与整个字符串进行比较,这仅适用于单个字符的字符串。什么是RDBMS?您正在使用哪些区分大小写和/或排序选项?为什么要将密码存储在纯文本中,并强制要求密码以大写字母开头?不相关,但如果密码的第一个字母对您很重要,那么您似乎没有加密或散列您的密码。你应该是。最好是对你的密码进行哈希(和盐渍)运算。我算出来了。这是一个很好的问题,请记住永远不要存储密码。您使用的是哪种DBMS?“在大多数其他数据库中,=的默认排序规则的大小写相同。”-这不是真的(并且违反了SQL标准)。在(至少)Oracle、Postgres、DB2、Firebird、Informix、Vertica、Teradata、Greenplum、HSQLDB和Apache Derby中,字符串比较区分大小写感谢您的回答。我把整封信比作一封没有意义的信。尽管双方都有一个非常有效的加密案例,这样双方都看不到原始和最终形式@user3716005只要在创建密码和登录匹配时执行相同的例程,它就不会为匹配带来任何问题(Gordon并没有暗示这会)。向OP道歉,但在特定位置的限制是愚蠢的,因为每个用户都知道该特定位置具有该限制(相反,最好在字符串中要求大写字母)。虽然大多数用户都很懒惰,但攻击者不知道字符串是否为string、string、string等。我澄清了这句话。“在大多数其他数据库中,=的默认排序规则的大小写相同。”-这不是真的(并且违反了SQL标准)。在(至少)Oracle、Postgres、DB2、Firebird、Informix、Vertica、Teradata、Greenplum、HSQLDB和Apache Derby中,字符串比较区分大小写感谢您的回答。我把整封信比作一封没有意义的信。尽管双方都有一个非常有效的加密案例,这样双方都看不到原始和最终形式@user3716005只要在创建密码和登录匹配时执行相同的例程,它就不会为匹配带来任何问题(Gordon并没有暗示这会)。向OP道歉,但在特定位置的限制是愚蠢的,因为每个用户都知道该特定位置具有该限制(相反,最好在字符串中要求大写字母)。虽然大多数用户都很懒惰,但攻击者不知道字符串是否为string、string、string等。我澄清了这一说法。