programing

문자열 매개 변수를 정수 열에 암묵적으로 캐스팅하는 MariaDB 10.3 실패

yoursource 2022. 11. 21. 23:00
반응형

문자열 매개 변수를 정수 열에 암묵적으로 캐스팅하는 MariaDB 10.3 실패

MariaDB 10.0.x에서 10.3.x로 업그레이드한 후 따옴표로 묶인 정수 문자열을 포함하는 SELECT가 더 이상 INTEGER 열 값으로 암묵적으로 캐스팅되지 않으므로 쿼리 실패, 1366, 잘못된 정수 값이 발생합니다.암묵적인 변환을 유효하게 하는 방법이 있습니까?

이 문제에 대처하기 위해 몇 가지 SQL_MODE 설정을 시도했지만 효과가 없습니다.여기 간단한 시나리오 예가 있습니다.

CREATE TABLE IF NOT EXISTS database.tablename (
   col1 INTEGER UNSIGNED,
   col2 INTEGER UNSIGNED,
   PRIMARY KEY (col1)) ENGINE = MEMORY;
INSERT INTO database.tablename VALUES (1,'2');

쿼리 실패(1366), : 1행의 '데이터베이스', 'tablename', 'col2' 열에 대한 잘못된 정수 값입니다.

MariaDB 10.0.x에서 발생한 것처럼 2열이 INTEGER UNSIGNARED에 암묵적으로 캐스팅되는 쿼리가 성공하기를 기대합니다.

무슨 일이 일어나고 있는지 알아냈어요

STICT_TRANS_TABLES 모드를 이노블로 하면 INTEGER 컬럼에 기본값이 제공되지 않는 테이블 정의에 문제가 발생할 수 있습니다.이는 마리아DB 10.0.38과 10.3.15 사이에 STICT_TRANS_TABLES가 포함된 기본 SQL_MODE가 변경되었기 때문에 MariaDB 10.3에서는 새로운 문제가 되었습니다.이 문제는 플래그를 제거하여 해결할 수 있습니다.

연결된 프로세스와 함께 실행 중인 MariaDB에서 플래그 제거

set sql_mode = " , set GLOBAL sql_mode = " ,

는 접속 프로세스가 재기동되어 데이터베이스에 대한 접속이 리셋될 때까지 INSERT 동작을 변경하지 않습니다.그 후 데이터 유형 기본값 규칙이 적용되고 오류 없이 INSERT 쿼리가 수행됩니다.

따라서 쿼리에서 인용되는 정수 데이터형이 문제가 아니라 접속에 대해 STRICT_TRANS_TABLES가 네이블로 유지되었을 때 컬럼에 정수 디폴트값이 없었던 것이 문제였습니다.

빠른 솔루션이 필요한 경우 쿼리 전에 set sql_mode = "를 추가할 수 있습니다.예:

set sql_mode = "";
your sql here;

언급URL : https://stackoverflow.com/questions/56173363/mariadb-10-3-implicit-cast-of-string-parameter-to-integer-column-fails

반응형