[英]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.