쿼리와 연관된 시스템 설정
개요
- DDL : 데이터베이스나 테이블의 구조를 변경하기 위한 문장
- DML : 테이블의 데이터를 조작(읽고, 쓰기)하기 위한 문자
- SQL : DDL + DML
대소문자의 구분, 문자열 표기 방법 등과 같은 SQL 작성규칙은 Mysql 서버의 시스템 설정에 따라진다. 시스템 설정이 쿼리에 어떤 영향을 주는지 확인하고, 예약어는 어떻것이 있는지 살펴보겠다.
7.1.1 SQL 모드
- STRICT_ALL_TABLES : 일반적으로 Mysql 에서는 저장하려는 값이 칼럼의 길이보다 더 긴경우라도 에러가 발생하지 않는다. 그러나 해당 설정을 하면 칼럼의 정해진 길이보다 큰 값을 자장할 때 경고가 아닌 요류가 발생하고 쿼리 실행이 중지된다
- STRICT_TRANS_TABLES : 칼럼타입과 호환되지 않는 값을 저장할 때, Mysql 서버는 비슷한 값으로 최대한 바꿔서 저장하려고 한다. 이 설정을 하면 원하지 않는 데이터의 타입이 변환이 필요할 때 서버는 강제 변환하지 않고 에러를 발생시킨다.
- TRADITIONAL : STRICT_TRANS_TABLES, STRICT_ALL_TABLES 와 비슷하지만 조금 더 엄격한 방법으로 SQL작동을 제어한다.
- ANSI_QUOTES : Mysql 에서는 문자열 값을 표현하기 위해 홑따옴표와 쌍따옴표를 동시에 사용할 수 없다. 이 설정을 하면 홑따옴표만 문자열 값 표기로 사용할 수 있고, 쌍따옴표는 칼럼명이나 테이블명과 같은 식별자를 표기하는 데만 사용할 수 있다.
- ONLY_FULL_GROUP_BY : Mysql 의 쿼리에서는 group by 절에 포함되지 않은 컬럼이라도 집합 함수의 사용없이 그대로 SELECT 절이나 HAVING 절에 사용할 수 있다. 이는 SQL 표준이나 다른 DBMS 와는 다른 동작방식인다, 이설정은 SQL 문법을 조금 더 엄격한 규칙을 적용한다.
-
PIPE_AS_CONCAT : Mysql 에서 " " 는 OR 연산자와 같은 의미로 사용된다. 이설정은 문자열연결(CONCAT)연산자로 사용할 수 있다. - PAD_CHAR_TO_FULL_LENGTH : Mysql 에서 CHAR 타입이라 하더라도 VARCHAR 같이 유효 문자열 뒤의 공백문자는 제거되어 반환된다.
- NO_BACKSLASH_ESCAPES : Mysql 에서도 일반적인 프로그래밍 언어에서처럼 역 슬래시 문자를 이스케이프 문자로 사용할 수 있다. 이설정은 역슬래시를 문자의 이스케이프 용도로 사용하지 못한다.
- IGNORE_SPACE : Mysql 에서 스토어드 프로시저나 함수의 이름 뒤에 공백이 있으면 "스토어드 프로시저나 함수가 없습니다."라는 에러가 출력될 수 있다. Mysql 에서는 스토어드 프로시저나 함수명과 괄호 사이에 있는 공백까지도 스토어드 프로시저나 함수의 이름으로 간주한다. 이설정은 프로시저나 함수명과 괄호 사이의 공백은 무시한다.
- ANSI : 이설정은 위에 여러가지 옵선을 조합헤서 MYSQL서버가 최대한 SQL표준에 맞게 동작하게 만들어준다.
7.1.2 영문 대소문자 구분
Mysql 서버는 설치된 운영체제에 따라 테이블명의 대소문자를 구분한다. 이는 mysql 의 db 나 테이블이 디스크의 디렉터리나 파일로 맵핑되기 때문이다. 즉 윈도우는 대소문자를 구분하지 않지만, 유닉스 계열의 운영체제는 대소문자를 구분한다. 대소문자 구분의 영향을 받지 않게 하려면 Mysql 설정파일에 "lower_case_table_name" 시스템 변수를 설정하면 된다.
7.1.3 Mysql 예약어
데이터베이스나 테이블, 그리고 칼럼의 이름을 예약어와 같은 키워드로 생성하면 해당 칼럼이나 테이블을 SQL 에서 사용하기 위해서는 항상 역따옴표(`)를 깜싸줘야한다. 이러한 예약어를 모두 구분하기란 쉽지 않은일이다.
항상 테이블을 생성할 때는 역따옴표로 테이블이나 칼럼의 이름을 둘러싸지 않은 상태로 생성하길 권장한다. 그래야만 예약어인지 아닌지를 Mysql 서버가 에러로 알려주기 때문이다. 만약 테이블 생성이 실패하는 경우라면 해당 예약어는 역따옴표로 감싸지 않고는 사용할 수 없다는 것을 의미한다.