Search
Duplicate
1️⃣

쿼리 작성과 연관된 시스템 변수

: 대소문자 구분, 문자열 표기 방법 등과 같은 SQL 작성 규칙은 시스템 설정에 따라 달라짐

1. SQL 모드

: sql_mode라는 시스템 설정에는 여러 개의 값이 동시에 설정될 수 있음
MySQL 서버의 sql_mode 시스템 변수에 설정된 값은 SQL 문장 작성 규칙뿐만 아니라 MySQL 서버 내부적으로 자동 실행되는 데이터 타입 변환 및 기본값 제어 등과 관련된
옵션도 가지고 있으므로 일단 MySQL 서버에서 한 번 테이블을 생성하고 데이터를 저장했다면 가능한 시스템 변수의 내용을 변경하지 않는 것이 좋다.
STRICT_ALL_TABLSE & STRICT_TRANS_TABLES
: MySQL 서버에서 INSERTUPDATE 문장으로 데이터를 변경하는 경우, 칼럼의 타입과 저장되는 값의 타입이 다른 경우 자동으로 타입 변경을 수행, 이때 타입이 적절히
변환되기 어렵거나 칼럼에 저장될 값이 없거나 값의 길이가 칼럼의 최대 길이보다 큰 경우, 문장을 계속 실행할지, 에러를 발생시킬지 정함
ANSI_QUOTES
: MySQL에서는 문자열 리터럴을 표현하기 위해 홑따옴표와 쌍따옴표를 동시에 사용할 수 있는데, 이때 홑따옴표만 문자열 리터럴 표기로 사용할 수 있게끔 해줌
ONLY_FULL_GROUP_BY
: MySQL 쿼리에서는 GROUP BY 절에 포함되지 않은 칼럼이더라도 집합 함수의 사용 없이 그대로 SELECT 절이나 HAVING 절에 사용할 수 있는데, 이를 제한하는 것
PIPE_AS_CONCAT
: MySQL에서 ||는 OR 연산자와 같은 의미로 사용되나 이 값을 설정하면 오라클과 같이 문자열 연결 연산자로 사용할 수 있음
PAD_CHAR_TO_FULL_LENGTH
: CHAR 타입이라고 해도 VARCHAR와 같이 유효 문자열 뒤의 공백 문자가 제거되어 반환하는데, 제거하지 않고 반환하게 해주는 것
NO_BACKSLASH_ESCAPES
: 일반적인 프로그래밍 언어에서처럼 역슬래시 문자를 이스케이프 문자로 사용하는 것을 사용하지 못하게 하는 것
IGNORE_SPACE
: MySQL에서 스토어드 프로시저나 함수의 이름 뒤에 공백이 있으면 찾지 못하는 오류가 발생할 수 있으나 이는 공백까지도 함수의 이름으로 간주하게 해주며 이 설정이 기본값
REAL_AS_FLOAT
: MySQL에서 부동 소수점 타입은 FLOATDOUBLE 타입이 지원되는데 REAL 타입은 DOUBLE과 동의어로 작동함, 하지만 이를 작동하면 FLOAT과 동의어로 작동(왜 있지)
NO_ZERO_IN_DATE & NO_ZERO_DATE
: 이 두 옵션이 활성화되면 MySQL 서버는 DATE 또는 DATETIME 칼럼에 2022-00-00과 같은 잘못된 날짜를 저장하지 못하게 됨
ANSI
: 이 값은 앞에서 설명한 여러 가지 옵션을 조합해서 MySQL 서버가 최대한 SQL 표준에 따라 동작하게 만들어줌
TRADITIONAL
: STRICT_TRANS_TABLESSTRICT_ALLTABLES와 비슷하지만 조금 더 엄격한 방법으로 SQL의 작동을 제어함

2. 영문 대소문자 구분

: MySQL 서버는 운영체제에 따라 테이블명의 대소문자를 구분, 이는 MySQL의 DB나 테이블이 디스크의 디렉터리나 파일로 매핑되기 때문
: 윈도우에 설치된 MySQL에서는 대소문자를 구분하지 않지만 유닉스 계열의 운영체제에서는 대소문자를 구분, DB나 테이블명의 대소문자 구분은 가끔 윈도우에서 운영되던 MySQL
데이터를 리눅스로 가져오거나 그 반대의 경우 문제가 되기도 함
: MySQL 서버가 운영체제와 관계없이 대소문자 구분의 영향을 받지 않게 하려면 파일에 lower_case_table_names라는 해당 시스템 변수를 설정해주면 됨, 1로 설정하면 모두 소문자로
저장되고 MySQL 서버가 대소문자를 구분하지 않게 해줌, 윈도우나 macOS에서는 2를 설정할 수 있는데 이는 저장은 대소문자를 구분하나 쿼리에서는 구분하지 않음

3. MySQL 예약어

: 생성하는 데이터베이스나 테이블, 칼럼의 이름을 예약어와 같은 키워드로 생성하면 사용하기 위해 `"로 감싸야함.. 쓰지 말자..
: 예약어를 감싸고 테이블을 생성하면 보통 에러를 발생시키지 않으므로 예약어를 모두 외울 수 없다면 역따옴표나 쌍따옴표로 감싸는 행위를 하지 말자