Programing

"열에 비해 데이터가 너무 깁니다."-이유가 무엇입니까?

lottogame 2021. 1. 6. 07:39
반응형

"열에 비해 데이터가 너무 깁니다."-이유가 무엇입니까?


가상 병원 기록에 대한 데이터베이스를 만들고 데이터로 채우는 MySQL 스크립트를 작성했습니다. 테이블 중 하나 인 Department에는 varchar (200) 유형으로 선언 된 Description이라는 열이 있습니다. 설명에 대한 INSERT 명령을 실행할 때 오류가 발생합니다.

오류 1406 : 행 1의 'Description'열에 대한 데이터가 너무 깁니다.

삽입하는 모든 문자열이 150 자 미만입니다.

다음은 선언입니다.

CREATE TABLE Department(
    ...
    Description varchar(200)
    ...);

다음은 삽입 명령입니다.

INSERT INTO Department VALUES
(..., 'There is some text here',...), (..., 'There is some more text over here',...);

겉으로보기에 이것은 효과가있을 것입니다. 누구든지 통찰력이 있습니까?


열 유형을 다음으로 변경 LONGTEXT


이전 데이터베이스를 새 버전으로 마이그레이션 할 때 비슷한 문제가 발생했습니다.

STRICT를 사용하지 않도록 MySQL 모드를 전환하십시오.

SET @@global.sql_mode= 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

오류 코드 : 1406. 열에 대한 데이터가 너무 깁니다.-MySQL


열 수 또는 개별 열 길이에 관계없이 mysql 테이블의 단일 행에 저장할 수있는 데이터 양에 대한 엄격한 제한이 있습니다.

공식 문서에 명시된대로

최대 행 크기는 모든 열의 총 길이가이 크기를 초과 할 수 없기 때문에 열 수 (및 크기)를 제한합니다. 예를 들어 utf8 문자에는 문자 당 최대 3 바이트가 필요하므로 CHAR (255) CHARACTER SET utf8 열의 경우 서버는 값당 255 × 3 = 765 바이트를 할당해야합니다. 결과적으로 테이블은 65,535 / 765 = 85 개 이상의 열을 포함 할 수 없습니다.

가변 길이 열의 스토리지에는 행 크기에 대해 평가되는 길이 바이트가 포함됩니다. 예를 들어, VARCHAR (255) CHARACTER SET utf8 열은 값의 길이를 저장하는 데 2 ​​바이트를 사용하므로 각 값은 최대 767 바이트를 차지할 수 있습니다.

여기에서 INNODB 테이블 제한 사항을 찾을 수 있습니다.


종종 그렇듯이 그것은 내 입장에서 어리석은 오류였습니다. 이 테스트 방식에서는 데이터 유형을 varchar (50)에서 varchar (200)으로 변경 한 후 Department 테이블을 다시 빌드하지 않았습니다. 방금 열을 varchar (50)으로 사용하여 insert 명령을 다시 실행했습니다.


Varchar에는 자체 한계가 있습니다. 데이터 유형을 텍스트로 변경해보십시오.!


Hibernate를 사용하면 고유 한 UserType을 만들 수 있습니다. 이것이 제가이 문제를 위해 한 일입니다. 다음과 같이 간단합니다.

    public class BytesType implements org.hibernate.usertype.UserType {

         private final int[] SQL_TYPES = new int[] { java.sql.Types.VARBINARY };
     //...
    }

물론 자신의 UserType을 확장하여 구현할 것이 더 많지만 다른 메서드를 찾는 사람을 위해 그것을 버리고 싶었습니다.


필드가 200자인 테이블을 만들려고하는데 160 자 초반의 두 행을 추가했는데 괜찮습니다. 행이 200 자 미만입니까?

SqlFiddle 표시


소스 데이터가 대상 필드보다 크고 여분의 문자를 잘라 내고 싶지만 엄격 모드를 끄거나 대상 필드의 크기를 변경하고 싶지 않은 경우 데이터를 필요한 크기로 줄이십시오. 와 함께 LEFT(field_name,size).

INSERT INTO Department VALUES
(..., LEFT('There is some text here',30),...), (..., LEFT('There is some more text over here',30),...);

대상 필드 크기의 예로 "30"을 사용했습니다.

내 코드 중 일부에서는 대상 필드의 크기를 가져 와서 수행하는 것이 쉽습니다. 그러나 코드가 그렇게 어렵게 만들면 다른 답변 중 하나를 사용하십시오.


제 경우에는 데이터를 잘못된 유형으로 입력하여이 오류가 발생했습니다. 예를 들어, 긴 유형 열인 경우 문자열 유형으로 입력하려고했습니다. 따라서 입력하는 데이터와 유형이 동일한 지 확인하십시오.


아주 오래된 질문이지만 위에서 제안한 모든 것을 시도했지만 여전히 해결되지 않았습니다.

비슷한 구조의 히스토리 테이블에 레코드를 삽입하여 변경 사항을 추적하는 메인 테이블에 대한 삽입 / 업데이트 트리거를 수행 한 것으로 나타났습니다. 메인 테이블 컬럼의 크기를 늘 렸지만 히스토리 테이블 컬럼의 크기를 변경하는 것을 잊었 기 때문에 문제가 발생했습니다.

다른 테이블에서 비슷한 변경을 수행했는데 오류가 사라졌습니다.


당신이 가지고 가면 VARCHAR그것을 TEXTbcoz 로 변경하면 크기는 65,535이고 이미 더 필요한 경우에만 TEXT변경을 취할 수 있습니다 .LONGTEXT65,535

의 총 크기 LONGTEXT4,294,967,295자입니다.

참조 URL : https://stackoverflow.com/questions/18897420/data-too-long-for-column-why

반응형