DHistory

[Real MySQL 8.0] 11-1 쿼리 작성과 연관된 시스템 변수 본문

Infrastructure/MySQL

[Real MySQL 8.0] 11-1 쿼리 작성과 연관된 시스템 변수

ddu0422 2023. 6. 11. 22:44

11-1-1 SQL 모드

MySQL 서버의 설정 파일에서 sql_mode를 설정할 때는 구분자(,) 이용해 키워드를 동시에 설정할 수 있습니다.

 

MySQL 서버에서 INSERT나 UPDATE 문장으로 데이터를 변경하는 경우 칼럼의 타입과 저장되는 값의 타입이 다를 때 자동으로 타입 변경을 수행합니다.

 

MySQL에서는 문자열 값(리터럴)을 표현하기 위해 홑따옴표와 큰따옴표를 동시에 사용할 수 있습니다.

Oracle 같은 DBMS에서는 홑따옴표를 문자열 값을 표기하는 데 사용하고, 큰따옴표는 칼럼명이나 테이블명과 같은 식별자를 구분하는 용도로만 사용합니다.

=> 문자열을 표현할 때는 홑따옴표를 사용하는 습관을 길러 Oracle, MySQL에 상관없이 습관적으로 사용할 수 있습니다.

 

MySQL의 쿼리에서는 GROUP BY 절에 포함되지 않은 칼럼이라도 집합 함수의 사용 없이 그대로 SELECT 절이나 HAVING 절에 사용할 수 있습니다.

⇒ SQL 표준이나 다른 DBMS와는 다른 동작 방식입니다. 5.7 버전까지는 기본값이 비활성 상태입니다. 8.0 버전부터는 기본값으로 활성 상태입니다.

=> 성능이 저하될 수 있습니다.

 

MySQL에서 ||는 OR 연산자와 같은 의미로 사용합니다. 해당 값을 설정하면 Oracle과 같이 문자열 연결 연산자(CONCAT)로 사용할 수 있습니다.

 

MySQL에서는 CHAR 타입이라고 하더라도 VARCHAR와 같이 유효 문자열 뒤의 공백 문자는 제거되어 반환됩니다. CHAR 타입의 칼럼값을 가져올 때 뒤쪽의 공백이 제거되지 않고 반환돼야 한다면 해당 설정을 추가합니다.

⇒ 활성화 금지

 

MySQL에서는 역슬래시 문자를 escape 문자로 사용할 수 있습니다. 해당 설정을 추가하면 역슬래시 문자를 다른 문자와 동일하게 취급하기 때문에 escape문자로 사용할 수 없습니다.

⇒ 활성화 금지

 

MySQL에서는 스토어드 프로시저나 함수명과 괄호 사이에 있는 공백까지도 스토어드 프로시저나 함수의 이름으로 간주합니다. IGNORE_SPACE 옵션은 MySQL 서버의 내장 함수에만 적용합니다. 해당 옵션이 활성화되면 내장 함수는 모두 예악어로 간주되어 테이블이나 칼럼의 이름으로 사용할 수 없습니다.

 

MySQL 서버에서는 부동 소수점 타입은 FLOAT과 DOUBLE 타입을 지원합니다. REAL 타입은 DOUBLE 타입의 동의어로 사용됩니다. 해당 옵션이 활성화되면 REAL 타입은 FLOAT 타입의 동의어로 사용됩니다.

 

두 옵션이 활성화되면 MySQL 서버는 DATE 또는 DATETIME 타입의 칼럼에 잘못된 날짜를 저장하는 것이 불가능해집니다. ex) ‘2020-00-00’, ‘0000-00-00’

 

MySQL 서버가 최대한 SQL 표준에 맞게 동작하게 만듭니다.

 

STRICT_TANS_TABLES, STRICT_ALL_TABLES와 비슷하지만 더 엄격한 방법으로 SQL의 작동을 제어합니다.

 

11-1-2 영어 대소문자 구분

MySQL 서버는 설치된 운영체제에 따라 테이블명의 대소문자를 구분합니다. ⇒ MySQL의 DB나 테이블이 디스크의 디렉터리나 파일로 매핑되기 때문입니다.

  • 윈도우 → 대소문자 구분 x
  • 유닉스 → 대소문자 구분 o

 

운영체제와 관계없이 대소문자 구분의 영향을 받지 않게 하려면 MySQL 서버의 설정 파일에 lower_case_table_names 시스템 변수를 설정하면 됩니다.

0 대소문자 구분 O
1 소문자로만 저장하고 대소문자 구분 X
2 대소문자를 구분해서 저장하고 쿼리에서는 대소문자 구분 X

 

11-1-3 MySQL 예약어

생성하는 데이터베이스나 테이블, 칼럼의 이름을 예약어와 같은 키워드로 생성하면 해당 칼럼이나 테이블을 SQL에서 사용하기 위해 항상 역따옴표(`)나 쌍따옴표로 감싸야합니다.

 

예약어를 구분하기 위해 항상 테이블명이나 칼럼명을 역따옴표로 둘러싸지 않고 테이블을 생성해야 합니다.