문자열 매개 변수를 정수 열에 암묵적으로 캐스팅하는 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
'programing' 카테고리의 다른 글
JavaScript 함수에 PHP 배열을 전달합니다. (0) | 2022.11.21 |
---|---|
중첩된 JavaScript 개체를 평탄화/평탄화 해제하는 가장 빠른 방법 (0) | 2022.11.21 |
"glob" 유형 패턴에 대해 java.util.regex와 동등한 것이 있습니까? (0) | 2022.11.21 |
"org.mariadb.jdbc"라는 이름의 JBOSS 드라이버.드라이버"가 인스톨 되어 있지 않다. (0) | 2022.11.21 |
mysql은 어디에 데이터를 저장합니까? (0) | 2022.11.21 |