그러냐

MariaDB sql_mode STRICT_TRANS_TABLES ( NULL 값이 입력되는 경우 에러처리) 본문

mysql

MariaDB sql_mode STRICT_TRANS_TABLES ( NULL 값이 입력되는 경우 에러처리)

관절분리 2022. 10. 12. 15:35
반응형

기존 MariaDB에서 데이터를 입력시에 데이터값에 아무런 정보가 들어가지 않아도 문제가 발생되지 않았다
근데 기존 버전 10.1.38 버전에서는 문제없이 잘 입력되던데 10.4.7 버전으로 올리면서 저장이 되지 않는다

확인을 해보니 10.2.4 버전 이후로는 sql_mode에서 STRICT_TRANS_TABLES 값이 기본값으로 되어 있다
이모드로 되어 있는경우 데이터입력시에 빈공간으로 데이터를 입력시에 에러가 발생되게 해주는 모드이다
기존에는 데이터가 없을경우 기본 NULL값으로 데이터 입력이 되었는데 그럼 한번 확인해보자.

MariaDB 10.1.38 기본 모드에서 테이블 생성 후 작업 / 정상적으로 데이터값에 아무런 ” 입력이 없어도 정상적으로 입력이 된다

 
 
 
 
 
MySQL
 
1
2
3
4
5
6
7
MariaDB [jsh]> CREATE TABLE table_test ( `no` int(11) NOT NULL AUTO_INCREMENT,   PRIMARY KEY (`no`) ) ;
 
MariaDB [jsh]> insert into table_test (no) values ('0');
Query OK, 1 row affected (0.00 sec)
 
MariaDB [jsh]> insert into table_test (no) values ('');
Query OK, 1 row affected, 1 warning (0.00 sec)

그럼 기본 모드의 sql_mode의 환경설정값을 확인해보자

 
 
 
 
 
MySQL
 
1
2
3
4
5
6
7
MariaDB [jsh]>  SELECT @@global.sql_mode;
+--------------------------------------------+
| @@global.sql_mode                          |
+--------------------------------------------+
| NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)

그럼 이제 MariaDB 10.4.7 버전에서 동일하게 진행해보자 / 데이터값이 아무런값이 없을경우 저장이 안된다.

 
 
 
 
 
Shell
 
1
2
3
4
5
6
7
MariaDB [jsh]> CREATE TABLE table_test ( `no` int(11) NOT NULL AUTO_INCREMENT,   PRIMARY KEY (`no`) ) ;
 
MariaDB [jsh]> insert into table_test (no) values ('0');
Query OK, 1 row affected (0.000 sec)
 
MariaDB [jsh]> insert into table_test (no) values ('');
ERROR 1366 (22007): Incorrect integer value: '' for column `jsh`.`table_test`.`no` at row 1

sql_mode의 값을 확인해보자

 
 
 
 
 
MySQL
 
1
2
3
4
5
6
7
MariaDB [jsh]>  SELECT @@global.sql_mode;
+-------------------------------------------------------------------------------------------+
| @@global.sql_mode                                                                         |
+-------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)

기본 sql_mode에 뭔가 여래개의 옵션이 있는데 이중에 STRICT_TRANS_TABLES  모드가 있어 데이터에 입력값이 없을경우 에러처리를 진행하게된다

그럼 기존에 만들어 두었던 웹페이지에서 에러가 발생하기 때문에 이모드는 제외시키자

 
 
 
 
 
Shell
 
1
2
3
4
5
6
[root@xinet ~]# vi /etc/my.cnf.d/server.cnf
 
 
### mysqld 모드 부분에 내용을 추가
[mysqld]
sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

mariadb 재시작

 
 
 
 
 
Shell
 
1
[root@xinet ~]# systemctl restart mysql

sql_mode 확인

 
 
 
 
 
Shell
 
1
2
3
4
5
6
7
MariaDB [(none)]> SELECT @@global.sql_mode;
+--------------------------------------------+
| @@global.sql_mode                          |
+--------------------------------------------+
| NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.000 sec)

이제 데이터를 다시 입력해보는데 값을 없이 입력을 진행해보자  정상적으로 처리가 된다

 
 
 
 
 
MySQL
 
1
2
MariaDB [jsh]>  insert into table_test (no) values ('');
Query OK, 1 row affected, 1 warning (0.000 sec)

무조건 최신버전이 좋지는 않는것이다 보안정책이나 여러가지 업데이트로 인해 기존 사이트들은 문제가 발생할수 있는 여지가 있다

참고사이트 : https://mariadb.com/kb/en/library/sql-mode/

 

 

 

출처 : https://xinet.kr/?p=2191

반응형