django.db.db.ss.Operation Error: (1071, '지정된 키가 너무 깁니다. 최대 키 길이는 767바이트입니다')
내 모델:
class Course(models.Model):
language = models.ForeignKey(Language)
name = models.CharField(max_length=50, unique=True, default='course')
title = models.CharField(max_length=1024, default='no title')
foreign_title = models.CharField(max_length=1024, default='no title', blank=True)
header = models.CharField(max_length=1024, default='', blank=True)
description = models.TextField(null=True, blank=True)
def __str__(self):
return self.title
def __unicode__(self):
return u'%s' % self.title
나는 "독특_함께"를 추가한다.
class Course(models.Model):
language = models.ForeignKey(Language)
name = models.CharField(max_length=50, unique=True, default='course')
title = models.CharField(max_length=1024, default='no title')
foreign_title = models.CharField(max_length=1024, default='no title', blank=True)
header = models.CharField(max_length=1024, default='', blank=True)
description = models.TextField(null=True, blank=True)
class Meta:
unique_together = ['language', 'name', 'title']
def __str__(self):
return self.title
def __unicode__(self):
return u'%s' % self.title
마이그레이션 중 오류 발생 시간:
django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 767 bytes')
내 DB는 mysql Ver 15.1 Distributed 10.0.17-MariaDB, readline 5.2를 사용하는 debian-linux-gnu(x86_64)용입니다.
인덱스 mysql의 길이를 늘리려고 했습니다.
MariaDB [(none)]> set global innodb_file_format = BARRACUDA;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> set global innodb_large_prefix = ON;
Query OK, 0 rows affected (0.00 sec)
그러나 이것만으로는 불충분합니다.
django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 3072 bytes')
문제 인덱스 길이입니다.길이 제한 장고 인덱스를 지정하는 방법은 무엇입니까?
해결방법은
ALTER DATABASE `databasename` CHARACTER SET utf8;
"데이터베이스"를 다시 만들 수 있습니다.
CREATE DATABASE mydatabase CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
또는 설정 파일을 변경합니다./etc/mysql/mariadb.conf.d/50-server.cnf를 열고 다음을 변경합니다.
character-set-server = utf8
collation-server = utf8_general_ci
앞의 두 답변은 제 경우 도움이 되지 않았기 때문에, 저는 당신의 제한이 다음과 같을 때 제 사례에 대한 해결책을 게시합니다.1000
(예: 1071 '지정된 키가 너무 깁니다. 최대 키 길이는 1000바이트입니다.')
일단은 작업하고 있는지 확인해 주세요.utf8
부호화!
그런 다음 설정 파일로 이동합니다.my.ini
, 회선을 찾습니다.default-storage-engine=xxx
.그렇다면
default-storage-engine=MYISAM
로 변경해 주세요
default-storage-engine=InnoDB
그러면 문제가 해결되어야 합니다.
이유는 간단하다MYISAM
는 1000바이트보다 큰 키사이즈를 지원하지 않습니다.
다음 4가지가 모두 필요하다고 생각합니다.
SET GLOBAL innodb_file_per_table = ON,
innodb_file_format = Barracuda,
innodb_large_prefix = ON;
CREATE/ALTER TABLE ...
ROW_FORMAT = DYNAMIC or COMPRESSED
이 값은 한 열에 대한 767바이트 제한을 초과해야 하지만 전체 인덱스에 대한 3072바이트 제한을 초과하지는 않습니다.
문자열로 구성된 복합 고유 인덱스를 가지려면 일부 문자열을 정규화하십시오.긴 문자열을 4바이트 INT로 바꾸면 인덱스가 제한 아래로 축소됩니다.
데이터베이스를 MySQL-8.0.11 또는 ** MySQL-5.7.21***로 업그레이드하여 이행하면 utf8 및 utf8_general_ci를 사용할 수 있습니다.
문제가 발생하여 테스트 환경에서는 8.0.11로 업데이트하고 서버에서는 5.7.21로 업데이트했습니다.이제 두 환경 모두에서 마이그레이션됩니다.
나는 결국 추가하게 되었다.
'OPTIONS': { 'init_command': 'SET storage_engine=INNODB;' }
settings.py에 있는 DB 백업 구성에 저장하여 문제를 해결합니다.
MySQL 서버는 InnoDB를 기본 엔진으로 사용하도록 설정되었지만, 어떤 이유로 MyISAM을 사용하여 테이블을 생성하려고 했습니다.Django 2.2.1과 Python 3.6.7을 탑재한 MySQL 5.1을 실행하고 있습니다.
mysql을 5.7로 업그레이드하고 마이그레이션을 다시 시도하십시오.
wget https://dev.mysql.com/get/mysql-apt-config_0.8.1-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.1-1_all.deb
sudo apt-get update
sudo apt-get install mysql-server
이러한 오류에 대한 상위 게시물 중 하나이기 때문에 S3 경로를 내 db에 저장할 때 나에게 효과가 있었던 솔루션을 공유할 수 있습니다.
MySQL을 prefix
원하는 필드에 인덱스를 붙입니다.
# my_app/models.py
class File(models.Model):
s3_path = models.CharField(max_length=1024, help_text="S3 object key")
# my_app/migration_000x.py
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
(...),
]
operations = [
migrations.RunSQL(
sql="CREATE INDEX my_app_file_s3_path__prefix ON my_app_file (s3_path(768));",
reverse_sql="DROP INDEX my_app_file_s3_path__prefix ON my_app_file;",
)
]
) 을 받을 수, '100~200글자'를 유지하고 .max_length
AWS S3는 AWS S3에 있습니다.
하고 InnoDB
엔진utf8mb4_unicode_ci
내 모든 테이블에서.
로컬에서 데이터베이스를 내보내고 mysql - u username -p database_name < file . sql과 같은 명령줄을 사용하여 Import합니다.
언급URL : https://stackoverflow.com/questions/29782081/django-db-utils-operationalerror-1071-specified-key-was-too-long-max-key-le
'programing' 카테고리의 다른 글
JavaScript가 비활성화되어 있는지 여부를 검출하는 방법 (0) | 2022.11.23 |
---|---|
Laravel JSON Where Clauses with MariaDB 10.2.16 LongText 열을 사용할 수 있습니까? (0) | 2022.11.23 |
Shiro vs.스프링 보안 (0) | 2022.11.03 |
.jspf 파일 확장자가 뭐죠?어떻게 컴파일 할 것인가? (0) | 2022.11.03 |
mysql: Whoami? (0) | 2022.11.03 |