繁体   English   中英

在MySql中保持文本的大小写

[英]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字符串,请使用Collat​​ion 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM