我理解标题可能会令人困惑,因此无法用语言表达。如果有人能够提出更好的措辞,请随时改变它。
当我将值传递给MySQL中的数据库时,文本的“大小写”传递得很好,以及当我检索它时,例如:
存储在Db中,并在检索时:
Username: Ben
Password: PassWord
但是当我查询它时,我可以搜索
SELECT * FROM TableName WHERE Username = 'ben' AND Password = 'password';
对字体大小写没有限制。有没有办法设置它,以便如果使用上述查询,它将不返回任何内容,但如果我使用
SELECT * FROM TableName WHERE Username = 'Ben' and Password = 'PassWord';
这只会返回数据吗?
答案 0 :(得分:3)
您正在寻找的术语是"区分大小写"。这可以使用排序规则在MySQL中完成,也可以使用StringInstance.Equals
方法在C#中使用它的可选StringComparison
参数完成。通常,编程语言在字符串比较中区分大小写,而数据库查询语言不区分大小写(更正确地说,默认排序规则不区分大小写),因此这可能非常混乱。
如果要在SQL查询本身中执行此操作,则需要collate查询中的字符串。
示例:
SELECT * FROM table WHERE Password = 'PassWord' COLLATE utf8_bin
参见相关的SO question(在PHP中,但仍在使用MySQL)
如果从EntityFramework生成查询,则需要使用带StringComparsion.Ordinal的somestring.Equals(someOtherString)方法。
示例:
MyObject obj = someQueryable.FirstOrDefault(q => q.Password.Equals("PassWord", StringComparison.Ordinal));
这将导致生成的查询包含正确的归类代码。
答案 1 :(得分:0)
如果您想比较字符串case sensitive
,请使用排序规则latin1_bin
。默认排序规则为latin1_swedish_ci
,不区分大小写。
SELECT * FROM
TableName
WHERE Username COLLATE latin1_bin = 'Ben'
AND Password COLLATE latin1_bin = 'PassWord';
试试这个
答案 2 :(得分:-3)
很抱歉混淆:
首先,以明文形式存储您的密码是一个非常糟糕的主意,因为如果您的服务器遭到入侵,所有用户密码都可以用来劫持用户的其他地方的帐户
你可以使用哈希(是的,我知道,它也受到了损害,但更安全一点):
SELECT * FROM table WHERE Username = 'Ben' AND Password = SHA1('PassWord')
然后你必须将它插入sha1
- 哈希!
问题是,密码将保持区分大小写,至少如果你在插入之前不会降低/大写它。
INSERT INTO table (Username, Password) VALUES ('Ben', SHA1(LOWER('PassWord'));
SELECT * FROM table WHERE Username = 'Ben' AND Password = SHA1(LOWER('PassWord'));
会起作用,但它会减少散列熵,因为字符集仅限于小写字母。 你应该避免这样做。
清除:使用Hasing作为密码,并保留CASE SENSITIVE。
对于用户名案例敏感性尝试:
SELECT * FROM table WHERE LOWER(Username) = LOWER('BeN');