programing

오류 코드: 1406.데이터가 너무 길어서 열에 사용할 수 없음 - MySQL

goodsources 2023. 9. 8. 21:25
반응형

오류 코드: 1406.데이터가 너무 길어서 열에 사용할 수 없음 - MySQL

오류 코드: 1406.데이터가 너무 길어서 열에 사용할 수 없습니다.

CREATE  TABLE `TEST` 
(

  `idTEST` INT NOT NULL ,

  `TESTcol` VARCHAR(45) NULL ,

  PRIMARY KEY (`idTEST`) 
);

지금이다Insert어떤 가치관

INSERT INTO TEST
VALUES
(
    1,
    'Vikas'
)

select 

SELECT * FROM TEST;

를 합니다 합니다 이상의 레코드를 합니다.length

INSERT INTO TEST
VALUES
(
    2,
    'Vikas Kumar Gupta Kratika Shukla Kritika Shukla'
)

만약 우리가selectlength

SELECT LENGTH('Vikas Kumar Gupta Kratika Shukla Kritika Shukla')

 '47'

그리고 오류 메시지를 보여주고 있습니다.

오류 코드: 1406.데이터가 너무 길어서 열에 사용할 수 없습니다.

하지만 저의 기대는 표에 처음 45자 이상을 삽입하고 싶습니다.

질문이 명확하지 않다면 저에게 알려주시기 바랍니다.

저는 이 오류의 원인을 알고 있습니다.저는 데이터 타입의 길이 이상의 값을 삽입하려고 합니다.

MySQL에서 .MS SQL. 그래서 MySQL에도 있었으면 좋겠습니다.

MySQL은 지정한 열 너비를 초과하는 삽입 값을 잘라냅니다.

이것을 실수 없이 만들려면 당신의 것을 바꾸세요.SQL mode사용하지 않는STRICT.

Mysql 참조 매뉴얼


편집:

모드를 변경하려면 다음과 같이 하십시오.

이 작업은 두 가지 방법으로 수행할 수 있습니다.

  1. 를 .my.ini( (Windows)는my.cnf(Unix) 파일은 MySQL 설치 디렉토리 내에서 "sql-mode" 텍스트를 찾습니다.

찾기:

코드:

# Set the SQL mode to strict 
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

대체 위치:

코드:

# Set the SQL mode to strict 
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

아니면

  1. 데이터베이스 관리 도구(예: phpMyAdmin) 내에서 SQL 조회를 실행할 수 있습니다.

코드:

SET @@global.sql_mode= '';

사용자가 입력한 데이터가 앱에서 손실될 수 있기 때문에 STRICT 모드를 끄는 것은 좋은 선택이 아니라고 생각합니다.

앱에서 TESTcol 값을 받은 경우 Rails에서와 같이 모델 검증을 추가할 수 있습니다.

validates :TESTcol, length: { maximum: 45 }

SQL 스크립트에서 값으로 조작할 경우 SUBSTRING 명령으로 문자열을 자를 수 있습니다.

INSERT INTO TEST
VALUES
(
    1,
    SUBSTRING('Vikas Kumar Gupta Kratika Shukla Kritika Shukla', 0, 45)
);

최근에 저한테 이런 일이 있었어요.MySQL 5.7로 완전히 마이그레이션되었으며 모든 것이 기본 구성으로 되어 있습니다.

이전의 모든 답변은 이미 명확하며, 저는 그저 무언가를 추가하고 싶습니다.

이 1406 오류는 테이블의 열 길이뿐만 아니라 기능/절차에서도 발생할 수 있습니다.

저의 경우 IN 파라미터 varchar(16)로 어떤 통화 절차를 트리거했지만 32 length 값을 받았습니다.

이것이 비슷한 문제를 가진 사람에게 도움이 되었으면 좋겠습니다.

위에 제시된 답변 외에, 저는 단지 이 오류가 행이 잘못된 종료 문자를 가진 데이터를 가져오는 과정에서 발생할 수도 있다는 것을 덧붙이고 싶습니다.

예를 들어 윈도우에 덤프 파일을 csv 형식으로 저장합니다.그런 다음 가져오기 중에

LOAD DATA INFILE '/path_to_csv_folder/db.csv' INTO TABLE table1
 FIELDS TERMINATED BY ',' 
 ENCLOSED BY '"'
 ESCAPED BY '"'
 LINES TERMINATED BY '\n'
IGNORE 1 LINES;

Windows에서 \n을 사용할 때 줄 끝을 \r\n(즉, CFLF)으로 저장했습니다.pphMyAdmin은 파일을 가져올 수 없는데 왜 파일을 가져올 수 있었는지 정말 미칠 지경이었습니다.메모장++에서 파일을 열고 파일의 끝을 보았을 때 비로소 mysql이 종료된 어떤 줄도 찾을 수 없다는 것을 깨달았습니다(그리고 모든 줄을 필드의 입력으로 간주하여 불만을 일으키는 것 같습니다).

어쨌든 \n에서 \r\n로 만든 후에는 매력적으로 작용합니다.

LOAD DATA INFILE '/path_to_csv_folder/db.csv' INTO TABLE table1
 FIELDS TERMINATED BY ',' 
 ENCLOSED BY '"'
 ESCAPED BY '"'
 LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

이것은 제가 우분투와 함께 사용하는 단계입니다.입력한 문자를 45자 이상 삽입할 수 있지만 MySQL은 데이터베이스에 삽입하기 위해 텍스트를 45자로 잘라냅니다.

  1. 실행명령

    sudo nano /etc/my/my.cnf

  2. 그런 다음 이 코드를 붙여넣습니다.

    [mysqld] sql-mode="NO_AUTO_CREATE_USER, NO_ENGINE_Substitution"

  3. MySQL 재시작

    sudo service mysql restart;

이 질문은 검색 결과에 우선순위를 두고 있으므로 substr()을 사용하여 저장하기 전에 데이터를 미리 잘라낼 수 있다고 빠르게 말하고, 오류 코드: 1406으로 이어지는 대용량 데이터 저장의 더 심각한 문제로 넘어가겠습니다. 데이터가 너무 길어서 열이 없습니다.

저는 엄격한 모드를 끄라고 조언하는 모든 답변과 의견에 동의하지 않습니다.저장이 필요한 데이터는 저장해야 하고, 아무 예고 없이 미스터리하게 사라질 가능성에 맡겨서는 안 된다는 것이 그 전제입니다.좋은 테이블 구조를 권장하지만 대용량 데이터를 저장해야 하는 경우 열 용량을 다음과 같이 변경할 수 있습니다.

TEXT: 65,535 characters - 64 KB
MEDIUMTEXT: 16,777,215 - 16 MB
LONGTEXT: 4,294,967,295 characters - 4 GB

SQL 데이터베이스의 한계를 확인해 봅니다.이 행의 필드 제한을 초과한 것일 수도 있습니다.

장고에서 이미지 필드를 사용하는 동안 동일한 오류가 발생했습니다. post_picture = models.ImageField(upload_to='home2/khamulat/mydomain.com/static/assets/images/uploads/blog/%Y/%m/%d', height_field=None, default=None, width_field=None, max_length=None)

를 하였습니다에 하였습니다. post_picture = models.ImageField(upload_to='images/uploads/blog/%Y/%m/%d', height_field=None, default=None, width_field=None, max_length=None) 오류는 사라졌습니다.다고다는dese고.

primary key set으로 먼저 테이블 구조를 만든 후 csv 파일을 업로드하려고 하면 이 오류가 발생했습니다.제 CSV 파일은 기본 키 열에 정보가 들어 있었습니다.다른 sql 서버에서 내보낸 것입니다.아무리 수출하고 수입하려고 해도 소용이 없었습니다.

제가 해결하기 위해 한 일은 제 db와 csv에 기본 키 열을 떨어뜨려 업로드한 후 다시 기본 키 열을 추가하는 것이었습니다.

위의 답변들은 제.ini 파일을 업데이트하라고 알려주지만, 좀 더 높은 길이를 추가할 수 있도록 열 길이를 TEXT 또는 LONGTEXT로 변경하는 것이 좋을 것 같습니다.

부울 타입 열에 0을 저장하려고 하는데 실수로 0을 문자열로 전달하는 경우에도 같은 문제가 발생했습니다.

정확한 데이터를 만족스러운 데이터 유형으로 전달해야 합니다.

제 경우에는 부울 타입 열에 0이 아닌 '0'을 저장하려고 했습니다.

해당 열(예: max_length="150")에 대한 단어 수를 잘렸을 수 있으므로 모델로 이동하여 확인합니다.

언급URL : https://stackoverflow.com/questions/15949038/error-code-1406-data-too-long-for-column-mysql

반응형