MySQL Error 1264는 데이터를 삽입할 때 자주 접할 수 있는 에러 중 하나로,
메시지 그대로 해석하자면 삽입하려는 값이 컬럼의 제약 조건 범위를 넘었다는 의미이다.
개발자가 삽입 값과 컬럼의 범위를 확인하고 고치는 것이 가장 좋은 방법이지만,
어떠한 범위를 벗어났는지 모르겠을 때에는 아래 예시를 통해 에러 발생 가능성이 높은 값을 찾을 수 있을 것이다.
데이터 타입 범위 초과
삽입하려는 값이 타입이 허용하는 범위를 초과했을 때 1264 에러가 발생한다.
예를 들어, -128 ~ 127 범위의 정수만을 허용하는 TINYINT 타입의 컬럼에 정수 -1100, 128 등 범위 미만/초과 값을 삽입하려 할 때 해당 에러가 발생할 수 있다.
컬럼의 타입을 더 넓은 범위의 타입으로 변경하거나, 삽입하려는 값을 타입에 맞게 변환함으로서 해결할 수 있다.
숫자 형식 오류
위와 비슷한 맥락으로 삽입하려는 값이 잘못된 숫자 형식일 때 1264 에러가 발생한다.
그 예시로 실수의 정확한 표현을 위해 고정 소수점이 지정된 DECIMAL(3, 2) 타입의 컬럼에 123.456 등의 초과된 자릿수를 삽입하면 해당 에러가 발생할 수 있다.
컬럼이 가진 제약조건을 수하거나, 삽입할 값을 형식에 유효하도록 변경하는 방법으로 해당 원인을 해결할 수 있다.
💡 INT 타입에 실수를 입력하면 에러가 발생할까?
정답은 '에러가 발생하지 않는다' 이다. MySQL은 자동으로 타입 변환을 수행해준다.
실수가 INT 타입 컬럼에 삽입될 때, MySQL은 자동으로 해당 데이터를 적합한 타입으로 변환하기 위해 소수점 이하 숫자들을 제거하여 준다.
에러는 발생하지 않지만, 데이터 손실 가능성에 대한 경고를 노출시킨다.
AUTO_INCREMENT 범위 초과
데이터가 많아지면 AUTO_INCREMENT가 자동 증가하며 해당 컬럼 타입의 최대 값을 초과할 수 있다.
예를 들어 INT 타입의 AUTO_INCREMENT Primary Key를 가진 테이블의 튜플이 2,147,483,647개를 초과한다면 (혹은 해당 컬럼의 값이 2,147,483,647를 초과한다면) 해당 에러가 발생할 수 있다.
잦은 데이터 삭제로 인해 빈 ID가 존재한다면 아래 명령어를 통해 AUTO_INCREMENT 증가 값을 조정하여 데이터를 정리한다.
ALTER TABLE 'table_name' AUTO_INCREMENT = 변경할 값;
필자 같은 경우엔 크롤링 데이터를 DB에 삽입하던 중, 서비스 로직의 예외로 인해
UNSIGNED TINYINT 타입을 가진 price 컬럼에 -1 음수 값이 들어가 해당 오류가 발생하였다.
int price = -1;
/* 이와 같이 코드를 변경해주어 해결하였다. */
if (infoTitle.contains("Selling price")) {
int i = 0;
//자른 문자열이 숫자일 때까지 인덱스 증가시키기
while(i < splits.length && !splits[i].replace(",", "").matches("[0-9]{1,}")) i++;
price = Integer.parseInt(splits[i].replace(",", ""));
}
해당 에러는 이미 대량의 데이터가 삽입된 테이블의 컬럼 타입을 바꿔야할 수도 있는 대공사를 초래할 수도 있다.
위와 같은 에러를 접함으로써, 데이터베이스 설계의 중요성에 대해 다시 한 번 느낄 수 있는 계기가 되길 바란다.
'데이터베이스 > SQL' 카테고리의 다른 글
[MS-SQL] SQL Server 설치 및 DBeaver 연동 (3) | 2024.11.05 |
---|---|
데이터베이스 명명 규칙 (약어 사용 규칙) (0) | 2024.07.22 |
DB, DBMS, RDBMS, NoSQL (0) | 2024.07.11 |
[Oracle] DCL, TCL (0) | 2024.07.10 |
[Oracle] DDL, DML (0) | 2024.07.10 |