MySQL 의 CHAR 나  VARCHAR 컬럼에 데이타를 입력할 경우 컬럼 사이즈보다 큰 데이타가 입력됐을때 당연히 DB 차원에서 insert 가 안 되는줄 알았다.

 

그런데 특정 서버에서는 사이즈보다 큰 부분이 truncate 되고 insert 되어 찾아보니 MySQL 서버의 sql_mode 라는 설정의 strict mode에 따라 데이타 검증을 수행하는데 5.5의 경우 기본적으로 이 모드가 꺼져 있다고 한다.

 

MySQL 버전마다 다르겠지만 현재 사용하고 있는 5.5.40 의 기본 sql_mode 설정은 '' 이며 (https://dev.mysql.com/doc/refman/5.5/en/server-options.html#option_mysqld_sql-mode)

이 경우 STRICT_ALL_TABLES, STRICT_TRANS_TABLES 가 꺼지며 CHAR, VARCHAR 의 크기를 초과하는 데이타 입력시 에러를 내지 않고 잘리게 된다.

 

개인적인 생각으로는 이런 데이타의 무결성을  app 에서 하는것 보다는 DBMS 에서 체크하는게 더 편하고 이를 위해 DBMS 를 쓰는 것이므로 비록 속도가 저하되더라도 STRICT_MODE 로 쓰는게 좋다고 보다.

그러면 STRICT MODE 로 설정을 변경해 보자.

 

 

// my.cnf

[mysqld] sql_mode="NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES"

 

 

STRICT MODE 로 전환되었다면 다음 SQL 문은 오류가 나고 정상적으로 동작하지 않는다.

 

MySQL 5.7 부터는 STRICT_MODE 가 기본 설정이라고 하니 별도의 설정 작업이 필요없다.

 

 

 

참고 url: www.lesstif.com/dbms/mysql-strict-mode-24445406.html

MariaDB 10.3 버전 이후 부터 쿼리를 Oracle 모드로 사용할 수 있다.

 

show variables like 'sql_mode%';

 

// my.cnf

sql_mode=ORACLE

 

추가하여 저장하면 사용할 수 있다.

 

 

자세한 링크: mariadb.com/kb/en/sql_modeoracle-from-mariadb-103/

MariaDB version 10.3 이후 에서는

기본적으로 시퀀스 생성을 사용할 수 있다.

 

-- 버전 확인

SELECT VERSION(); // 10.4.12-MariaDB-1:10.4.12+maria~bionic-log

 

-- 시퀀스 생성문

CREATE SEQUENCE seq_template;

 

-- 현재 값
SELECT LASTVAL(seq_template);
-- 다음 값
select NEXTVAL(seq_template);

 

-- 현재 시퀀스 값 초기화
ALTER SEQUENCE seq_template RESTART 1;

+ Recent posts