- ViewBag
- 강제이동
- ViewData
- 하드 윈도우 복사
- 404에러페이지
- simpe ftp
- XSS PHP
- asp ftp
- SSD 복사
- 타임피커
- 하드 마이그레이션
- asp.net core Select
- 원격ftp
- Mac Oracle
- swagger 500 error
- ASP.Net Core 404
- 맥 오라클설치
- php 캐쉬제거
- XSS방어
- javascript redirection
- TempData
- asp.net Select
- javascript 바코드 생성
- asp.net core swagger
- 말줄임표시
- asp.net dropdownlist
- django 엑셀불러오기
- 바코드 생성하기
- JavaScript
- jquery 바코드생성
웹개발자의 기지개
[MariaDB] utf8mb4 에서 인덱스 길이 제한 처리하기 본문
10.1.13-MariaDB - MariaDB Server
-- ----------------------------------------------------------------
-- 7. Import history (track which CSV files have been processed)
-- ----------------------------------------------------------------
CREATE TABLE IF NOT EXISTS import_history (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
filename VARCHAR(500) NOT NULL,
file_size BIGINT,
rows_total INT DEFAULT 0,
rows_imported INT DEFAULT 0,
rows_skipped INT DEFAULT 0,
status ENUM('running','completed','failed') DEFAULT 'running',
started_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
finished_at DATETIME,
error_message TEXT,
UNIQUE KEY uq_filename (filename(400))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
MySQL 메시지: 문서
#1071 - 정의된 키가 너무 깁니다. 최대 키의 길이는 767입니다.
--> 에러가 발생했다.
MariaDB 10.1.13에서는 utf8mb4 사용 시 인덱스 길이 제한 때문에 발생하는 오류입니다.
MariaDB 10.1(InnoDB)의 최대 인덱스 길이:
767 bytes
utf8mb4 = 문자당 최대 4 bytes 가 되어 제한(767)을 초과합니다.
400 × 4 = 1600 bytes
[해결방법 1 (가장 간단)]
인덱스 길이를 191자로 줄이기
UNIQUE KEY uq_filename (filename(191))
UNIQUE KEY uq_filename (filename(400)) ----> UNIQUE KEY uq_filename (filename(191)) 변경
-------------------------------
[해결방법 2 (추천)]
191 x 4 = 764 bytes
filename VARCHAR(191) NOT NULL,
UNIQUE KEY uq_filename (filename)
------------------------------
[해결방법 3 (실무 추천)]
파일명이 길 수 있다면 MD5 해시 저장
filename VARCHAR(500) NOT NULL,
filename_md5 CHAR(32) NOT NULL,
UNIQUE KEY uq_filename_md5 (filename_md5)
[PHP]
$filename_md5 = md5($filename);
--------------------------------
MariaDB 10.1 기준 최종 추천
CREATE TABLE IF NOT EXISTS import_history (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
filename VARCHAR(500) NOT NULL,
filename_md5 CHAR(32) NOT NULL,
file_size BIGINT,
rows_total INT DEFAULT 0,
rows_imported INT DEFAULT 0,
rows_skipped INT DEFAULT 0,
status ENUM('running','completed','failed') DEFAULT 'running',
started_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
finished_at DATETIME,
error_message TEXT,
UNIQUE KEY uq_filename_md5 (filename_md5)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
MariaDB 10.1.13은 상당히 오래된 버전이라 utf8mb4 인덱스 관련 제약이 많습니다.
가능하다면 향후 MariaDB 10.6 이상으로 업그레이드하는 것도 고려해 보시는 것이 좋습니다.
'SQL > MySQL' 카테고리의 다른 글
| [MySQL] 쿼리문 만들기 - 특정한 임의의 PK 값으로 정렬시키기 (0) | 2025.08.19 |
|---|---|
| [MySQL] show full processlist (0) | 2025.01.06 |
| [MySQL] MariaDB 정렬순서 만들기 (Query) (0) | 2024.07.29 |
| [MySQL, MariaDB] ROW_NUMBER() 순위함수, 페이징을 위한 다중쿼리 (0) | 2024.03.12 |
| [MariaDB,MySQL] auto_increment 속성을 가지는 테이블의 다음 시퀀스값을 알고 싶을때 (0) | 2024.03.05 |
