본문 바로가기
SQL(DB)

SQL, 대소문자를 구분하고 싶을 때 (ft. 레코드 값 비교) - Binary

by 즐코딩 2023. 9. 25.
반응형

SQL, 대소문자를 구분하고 싶을 때 (ft. 레코드 값 비교) - Binary

 

와.. 처음 알았습니다. 이래서 실습 전 기초교육이 중요한 것이구나 라는 생각이 더욱 들었습니다.

직업상 인접분야라서 관심을 더욱 가지게는 되었지만, 개발자가 아닌 입장에서 지루해서 이론서를 틈나는대로 읽어봐야겠구나 하는 반성의 기회가 생겨 기록으로 남겨두고자 합니다.

 

 

개발자가 아니면 더욱 접하기 쉽지 않은 SQL 구문

 

SQL은 대충 이렇게 쓰는 거구나~ 하는 정도만 알고 있는 상태에서 오늘 아주 중요한 경험을 했습니다.

SQL 구문은 대소문자 구분없이 사용한다는 건 어깨 너머로 보고 알고 있었습니다.

 

예를 들어, SQL에서의 'Hello World'는 다음과 같겠죠? 둘 다 동일합니다.

SELECT * FROM 테이블명;
select * from 테이블명;

 

 

SQL은 왜 대문자 형태로 작성하는 것일까?

 

SQL은 왜 그렇게 만들어지게 되었는지는 모르겠지만, 아무튼 강의를 보면 대부분 대문자로 많이들 쓰더라구요.

이유가 궁금하여 ChatGPT에게 물어보니 이렇게 알려주는군요.

 

 

아마도, 프로그래밍 언어들과는 구분이 필요하기도 하거니와, 예전의 에디터들은 요즘의 IDE 처럼 알록달록한 형태로 가독성 향상을 지원해주던 시기가 아니었기 때문이 아니었을까? 하고 유추를 해봅니다.(뭐 대문자로 코드를 작성하는 프로그래밍 언어는 거의 없지 않을까요?)

 

 

SQL은 구문 뿐만 아니라, 레코드 비교에서도 대소문자를 구분하지 않는다?!

 

구문은 그렇다손 치더라도, DB Table에서 값을 읽어 올 때 조차도 기본적으로는 대소문자 구분을 하지 않는다는 사실을 이번에 뼈 아프게 배우게 되었습니다.

 

레코드값 비교도 대소문자 구분 없이 사용한다는 건 전혀 모르고 있었거든요.

예를 들어, 테이블에서 Q4w라는 레코드를 가진 대상의 index 넘버를 가져와서 활용하는 프로그래밍을 해두었다고 쳐봅시다. 뭐, 쇼핑몰로 따지면 Q4w라는 값을 가진 고객의 주소를 확인하고 배송을 보낸다고 해봅시다.

 

SELECT id FROM Guests Where Code = 'Q4w';

 

어떤 결과가 나올까요?

대소문자를 구분하지 않기 때문에 100,224와 100,250 이라는 2개의 결과값을 돌려줍니다.

 

만약 아래와 같은 코드로 배송 프로그램이 돌아가고 있었다면 어떤 일이 벌어질까요?
(↓ ※ 물론 동작하지 않는 코드입니다)

$sql = "
	SELECT id 
        FROM Guests 
        Where Code = 'Q4w';
        ";

$result = $sql 통신하여 리턴 받은 고객의 id;

$sql2 = "
	SELECT 고객주소 
        FROM 고객정보 
        Where 주소 = '$result';
        "
$result2 = $sql2 통신하여 리턴 받은 고객의 주소정보

배송하기($result2);

 

당근 빠따, 배송사고로 이어질 것입니다!! 

 

 

잘모를 때는? 일단 AI에게 물어보자.

 

모르면 물어봐야죠. 제가 짠 코드도 아닌데 제가 어떻게 알겠습니까? 대신 코드를 대충이라도 훑어 볼 수 있는 정도라야 AI 가 대답해주는 것을 조금이라도 이해하고 활용할수 있을 것입니다.

 

저는 공짜로 대답해주는 ChatGPT에게 물어봤습니다.

아래 처럼 대답을 해주긴 했지만, 대충 감을 잡을수 있었습니다.

 

 

헷갈리면, ChatGPT에게 한번 더 물어봅니다. 다른 대답을 또 들을 수 있으니까요.

 

ChatGPT가 알려준 결과를 적용하기 전 / 후의 SQL 비교

$sql = "
        SELECT Rooms.hotel_id, Guests.room_id, Guests.short_URL
        FROM Guests
        JOIN Rooms 
        ON Guests.room_id=Rooms.id
        -- AND short_URL = '$requestedURL';     -- Q4w를 가져와야 하는데 Q4W를 가져오는 현상 발생
        AND BINARY short_URL = '$requestedURL'; -- 레코드의 대소문자를 구분해서 비교
        ";

 

즉, 다시 말해서 SQL에서 레코드의 대소문자 구분을 하고 싶을때는 :  BINARY 키워드를 사용하면 됩니다.

BINARY 칼럼명 = '$변수명';

 

이참에 확실한 공부를 위해  ChatGPT에게 한번 더 물어봅니다.

 

초보자인 입장에서는 ChatGPT가 이럴 때 정말 고맙군요.

 

 

 

마치며

 

제가 개발자는 아니지만, 바쁘게 돌아가는 회사에서 스핀 오프 프로젝트의 프로토 타입 같은 것을 한번 직접 만들어 볼 수 있다면 참 좋지 않을까요? 더우기 개발자 리소스를 협조 받기가 어려운 경우라면 더 많은 아쉬움이 있을 것입니다.

 

이번에도 꾸역 꾸역 코드에 손을 대보고 있는데, 결과 값이 간헐적으로 이상하게 나오길래 찬찬히 확인을 해보니, SQL은 조회하는 값에 대해서 대소문자를 구분하지 않는다는 사실을 새롭게 알게 되었습니다.

 

곁에 두고 물어볼 수 있는 ChatGPT 가 있는 세상에 산다는게, 코딩학습자로서 아주~ 참 좋~습니다!

 

BINARY 키워드.. 아마도 이 녀석은 죽을 때까지 기억하고 있지 않을까 싶습니다.

 

오늘도 즐거운 코딩, 즐코딩.

KINcoding.com

 

 

반응형

댓글