-
[postgreSQL] 멀쩡한 컬럼인데 column does not exist 오류가 발생할 때개발/Database 2019. 1. 17. 09:37
이번에 시작한 토이 플젝에는 한번도 안 써본 디비를 써보자! 해서 야심차게 postgreSQL을 도입
하지만 처음 짜넣은 아주 간단한 select 문 실행에서부터 막혀버렸다ㅠ.ㅠ
SELECT COUNT(*) FROM V WHERE VOCA = #{voca}
라는 아주 아주 간단한 쿼리 문인데도 에러가 뜨면서
Column 'voca' does not exist
라고 찍힌다.
대체 왜??? 혹시나 오타가 났나 싶어서 다시 들여다봤지만 오타도 아니었다.
검색해보니 내가 지금까지 써본 DB는 대문자가 기본이고,
컬럼이나 테이블명에서는 대소문자 구별이 없어서 쿼리 짤 때 대문자로 쓰든 소문자로 쓰든 상관이 없었으나
postgreSQL은 소문자가 기본인게 모든 것의 원인이었다.....
(출처 : https://postgresdba.com/bbs/board.php?bo_table=P01&wr_id=129
postgreSQL에서는 기본적으로 모든 쿼리가 소문자로 변환되기 때문에 아래와 같은 결과가 나온다.
쿼리 : CREATE DATABASE TEST
쿼리결과 : test
쿼리 : CREATE DATABASE test
쿼리결과 : test
테이블명이 대문자 TEST인 경우라면
쿼리 : SELECT * FROM test;
쿼리결과 : 오류 발생
쿼리 : SELECT * FROM Test;
쿼리결과 : 오류 발생
쿼리 : SELECT * FROM "TEST";
쿼리결과 : 정상 실행
반면 테이블명이 소문자 test인 경우라면
쿼리 : SELECT * FROM test;
쿼리결과 : 정상 실행
쿼리 : SELECT * FROM Test;
쿼리결과 : 정상 실행
쿼리 : SELECT * FROM "TEST";
쿼리결과 : 오류 발생
때문에 postgreSQL을 쓴다면 가급적 다 소문자로 선언하라는 의견이 많은 듯 하다.
정리하자면
1. postgreSQL 에서는 소문자가 기본 → 쿼리 역시 소문자로 변환됨
2. 대소문자를 구분하고 싶다면 명시적으로 " " (쌍따옴표)로 감싸줘야 함
3. pgAdmin 을 통해 DB object 를 생성할 때는 항상 쌍따옴표를 자동으로 붙이기 때문에
입력한 대소문자가 그대로 반영됨
'개발 > Database' 카테고리의 다른 글
[Oracle] 시퀀스의 현재값 변경하기 (0) 2019.05.08 [MySQL] MySQL에서 ROW_NUMBER 사용하기 (0) 2019.02.19 SYS_CONTEXT 함수로 세션정보 추출하기 (0) 2019.01.14 TABLE Function 이라는 것도 있다 (0) 2019.01.09 데이터베이스의 SYNONYM 은 뭐하는 놈일까 (0) 2018.09.07 댓글