[英]Keeping text upper and lower case in MySql
我了解标题可能会造成混淆,措辞困难。 如果有人可以提出更好的措辞,请随时进行更改。
当我将值传递到MySQL中的数据库时,文本的“大小写”会很好地传递,以及在我检索它时,例如:
Username: Ben
Password: PassWord
但是当我查询它时,我可以搜索
SELECT * FROM TableName WHERE Username = 'ben' AND Password = 'password';
并且对字体大小写没有限制。 有没有一种方法可以设置它,以便如果使用上面的查询,它将不返回任何内容,但是如果我使用
SELECT * FROM TableName WHERE Username = 'Ben' and Password = 'PassWord';
仅此将返回数据?
您要查找的术语是“区分大小写”。 这可以在MySQL中使用排序规则,或者在C#中使用StringInstance.Equals
方法及其可选的StringComparison
参数来实现。 通常,编程语言在字符串比较中区分大小写,而数据库查询语言则不区分大小写(更恰当地说,默认排序规则不区分大小写),因此这可能会造成混乱。
如果要在SQL查询本身中执行此操作,则需要在查询中整理字符串。
例:
SELECT * FROM table WHERE Password = 'PassWord' COLLATE utf8_bin
查看相关的SO问题 (在PHP中,但仍使用MySQL)
如果要从EntityFramework等生成查询,则需要使用StringComparsion.Ordinal的somestring.Equals(someOtherString)方法。
例:
MyObject obj = someQueryable.FirstOrDefault(q => q.Password.Equals("PassWord", StringComparison.Ordinal));
这将导致生成的查询包含正确的整理代码。
如果要比较case sensitive
字符串,请使用Collation latin1_bin
。 默认排序规则为latin1_swedish_ci
,不区分大小写。
SELECT * FROM
TableName
WHERE Username COLLATE latin1_bin = 'Ben'
AND Password COLLATE latin1_bin = 'PassWord';
尝试这个
很抱歉将其混淆:
首先,将密码以纯文本格式存储是一个非常糟糕的主意,因为如果服务器受到威胁,则所有用户密码都可用于劫持其他位置的用户帐户。
您可以使用哈希(是的,我知道,它也受到了损害,但更安全):
SELECT * FROM table WHERE Username = 'Ben' AND Password = SHA1('PassWord')
然后,您一定要将其插入为sha1
-hash!
这样做的问题是,密码至少要保持区分大小写,至少在插入之前您不希望密码大写/小写。
INSERT INTO table (Username, Password) VALUES ('Ben', SHA1(LOWER('PassWord'));
SELECT * FROM table WHERE Username = 'Ben' AND Password = SHA1(LOWER('PassWord'));
可以使用,但是由于字符集仅限于小写字母alpha,因此可以减少哈希熵。 您也应该避免这种情况。
清除:使用Hasing作为密码,并使其区分大小写。
对于区分大小写的用户名,请尝试:
SELECT * FROM table WHERE LOWER(Username) = LOWER('BeN');
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.