2014-04-10 2 views
1

제목이 혼란스럽고 문제가있는 것으로 알고 있습니다. 누군가가 더 나은 표현을 생각해 내면 자유롭게 그것을 바꿀 수 있습니다.MySql에 대문자와 소문자를 유지하십시오.

내가 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

당신은 정렬보고 싶을 것입니다보십시오. 거기에 당신의 해결책이 있습니다. C#에서 MySQL을 읽는 데 사용중인 내용을 모르겠습니다. MySQL에 연결하는 라이브러리/프레임 워크를 알고 있다면 아마 코드 스 니펫을 줄 수 있습니다. LINQ (예 : EntityFramework)에서 다음과 같이 두 문자열에서 대/소문자를 구분할 수 있습니다. myObject = someQueryable.FirstOrDefault (q => q.Equals ("someString", StringComparison.Ordinal) 또한 :) 암호를 암호화되지 않은 형식으로 저장하고 있다고 말해주십시오. :) –

+0

걱정하지 않아도 모든 개인 자격 증명이 안전하게 암호화됩니다. – Ben

답변

2

당신이 찾고있는 용어는 "대소 문자 구분"입니다. 이 작업은 MySQL에서 데이터 정렬을 사용하거나 C#에서 StringComparison 매개 변수 인 StringInstance.Equals 메서드를 사용하여 수행 할 수 있습니다. 일반적으로 프로그래밍 언어는 문자열 비교에서 대소 문자를 구분하며 데이터베이스 쿼리 언어는 대소 문자를 구분하지 않습니다 (보다 정확하게는 기본 데이터 정렬은 대소 문자를 구분하지 않음). 이렇게하면 혼동을 일으킬 수 있습니다.

SQL 쿼리 자체에서이 작업을 수행하려는 경우 collate의 쿼리 문자열이 필요합니다.

예 :

SELECT * FROM table WHERE Password = 'PassWord' COLLATE utf8_bin 

SO question 관련 참조 (PHP에서,하지만 여전히 사용하여 MySQL의)

당신이 EntityFramework, 말에서 쿼리를 생성하는 경우

, 당신은 somestring를 사용하고자 할 것입니다 .Equals (someOtherString) 메서드는 StringComparsion.Ordinal입니다.

예 :

MyObject obj = someQueryable.FirstOrDefault(q => q.Password.Equals("PassWord", StringComparison.Ordinal)); 

이 적절한 정렬 코드를 포함하는 생성 된 쿼리의 원인이됩니다.

-3

죄송 그것을 섞어 :

먼저이 서버 GET의 손상 경우, 모든 당신 사용자 암호가 다른 사용자의 계정을 납치하는 데 사용할 수 있기 때문에, 일반 텍스트로 암호를 저장하는 아주 아주 나쁜 생각입니다 .

당신은 해시를 사용할 수 있습니다 (예 내가 알고, 너무 손상,하지만 좀 더 안전한) :

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')); 

해시 엔트로피는 감소하지만 문자 집합은 소문자 알파로 제한되어 있기 때문에 해시 엔트로피가 감소합니다. 그렇게하는 것도 피해야합니다.

삭제 : 암호로 Hasing을 사용하고 CASE SENSITIVE로 두십시오. 아이디 케이스 - sensivity의 시도에 대한

:

SELECT * FROM table WHERE LOWER(Username) = LOWER('BeN'); 
+0

Downvotes bcause? – TheHe

0

문자열 case sensitive을 비교하려는 경우 데이터 정렬 latin1_bin을 사용하십시오. 기본 데이터 정렬은 대소 문자를 구분하지 않는 latin1_swedish_ci입니다.

SELECT * FROM 
     TableName 
       WHERE Username COLLATE latin1_bin = 'Ben' 
       AND Password COLLATE latin1_bin = 'PassWord'; 

는이

+0

유효하지 않은 데이터 정렬 'latin1_bin'이 (가) 나타 납니까? 사용할 수있는 데이터 정렬 목록을 찾는 방법을 알고 있습니까? –

+0

phpmyadmin에서 구조를 클릭하고 특정 필드 또는 열을 편집하기 위해 데이터 정렬 목록을 확인하십시오. – Sadikhasan

+0

OP에 PHP가 언급되지 않았거나 phpMyAdmin을 사용 중입니다 ... –

관련 문제