programing

"컬럼에 대한 데이터가 너무 깁니다." - 왜요?

itsource 2022. 10. 4. 22:56
반응형

"컬럼에 대한 데이터가 너무 깁니다." - 왜요?

MySQL 스크립트를 작성하여 가상의 병원 기록을 위한 데이터베이스를 만들고 데이터를 채웁니다.테이블 중 하나인 Department에는 Description이라는 이름의 열이 있으며 이 열은 type varchar(200)로 선언됩니다.Description(설명)에 대한 INSERT 명령을 실행하면 다음 오류가 나타납니다.

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

삽입하는 문자열은 모두 150자 미만입니다.

츠키다

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

삽입 명령어는 다음과 같습니다.

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

어느 모로 보나, 이것은 효과가 있을 것이다.누구 통찰력 있는 사람?

을 '하다'로 합니다.LONGTEXT

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

MySQL 모드를 STRICT를 사용하지 않도록 전환합니다.

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

에러 코드: 1406.데이터가 열에 비해 너무 깁니다(MySQL).

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

공식 문서에 기재된 바와 같이

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

가변 길이 열의 저장소에는 행 크기에 대해 평가되는 길이 바이트가 포함됩니다.예를 들어 VARCHAR(25) CHARTER SET utf8 열은 값의 길이를 저장하는 데 2바이트가 소요되므로 각 값은 최대 767바이트가 소요됩니다.

INNODB 테이블의 제한 사항을 확인할 수 있습니다.

mysql을 합니다.VARCHAR 다음 "이렇게 "로 변경해 주세요.TEXT로, bcoz를 취득할 수 는, 「65,535」를 취득할 수 있습니다.TEXT을 와와로 LONGTEXT 의 것이 65,535.

of의 총 LONGTEXT4,294,967,295 표시

Varchar에는 한계가 있습니다.데이터 타입을 텍스트로 변경해 보세요!

알고 보니, 흔히 있는 일이지만, 그건 내 멍청한 실수였어.이 테스트 방법에서는 데이터 유형을 varchar(50)에서 varchar(200)로 변경한 후 부서 테이블을 재구축하지 않았습니다.열은 varchar(50)로 유지한 채 insert 명령을 다시 실행했을 뿐입니다.

휴지 상태에서는, 독자적인 유저 타입을 작성할 수 있습니다.그래서 나는 이 문제를 위해 그렇게 했다.다음과 같이 간단한 것입니다.

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

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

물론 사용자 타입의 확장에 의해서 실장할 수 있는 것도 있습니다만, 다른 방법을 찾고 있는 유저에게 이 점을 알리고 싶다고 생각하고 있습니다.

하지 않으려면 에서한 크기로 .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"을 사용했습니다.

내 코드 중 일부에서는 대상 필드의 크기를 쉽게 파악하여 이 작업을 수행할 수 있습니다.하지만 당신의 코드가 그렇게 어렵다면, 다른 해답 중 하나를 택하세요.

매우 오래된 질문이지만, 위에서 제시한 모든 것을 시도해 보았지만 여전히 해결되지 않았습니다.

유사한 구조의 이력테이블에 레코드를 삽입하여 변경을 추적하는 메인테이블 삽입/갱신 트리거가 있었습니다.메인 테이블 열의 크기를 늘렸는데 이력 테이블 열의 크기를 변경하는 것을 잊어버려서 문제가 발생하였습니다.

다른 테이블에서도 비슷한 변경을 했더니 오류가 사라졌습니다.

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

SqlFiddle 표시

저는 열 유형을 BIT로 정의했습니다(예: "boolean")

UI(Workbench)를 통해 열 값 "1"을 설정하려고 했을 때 "Data too long for column" 오류가 발생했습니다.

BIT 값 설정에는 다음과 같은 특별한 구문이 있음을 알 수 있습니다.

b'1'

해시된 비밀번호를 테이블에 저장할 때도 같은 문제가 발생하였습니다.최대 열 길이를 변경하는 것은 도움이 되지 않았습니다.모든 것이 간단했다.이전에 작성한 테이블을 데이터베이스에서 삭제한 후 허용되는 길이의 새 값으로 코드를 테스트해야 했습니다.

「 」를 사용하고 있는 는,type: DataTypes.STRING, 이 만큼 길면 DataTypes.STRING(1000)

내 경우 데이터를 잘못 입력했기 때문에 이 오류가 발생했습니다. 예를 들어, 긴 유형의 컬럼인 경우 문자열 유형을 입력하려고 했습니다.입력하신 데이터가 동일하거나 동일하지 않은지 확인하시기 바랍니다.

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

반응형