일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 반려견놀이터
- 초밥
- 10월와인
- 스시
- 용인중앙시장야시장
- 기흥반려견놀이터
- 와인특가
- 삼양맵탱
- 와인할인
- gs25
- 10월장터
- 이마트와인장터
- 자연에서갈아만든생와사비
- 와사비
- 용인강아지놀이터
- 10월와인장터
- 용인야시장
- 별빛마당
- 이마트
- 주비푸드
- 고추냉이
- 이마트와인
- mysql1267
- 와인초특가
- 와인장터
- 샘표계란이맛있어지는간장
- gs25맵탱
- 생와사비
- 강아지간식
- 용인중앙시장
- Today
- Total
기억의 기록
Mysql - Error Code: 1267. Illegal mix of collations 에러 해결 본문
Error Code: 1267. Illegal mix of collations 에러는 문자셋이 맞지 않아서 발생하는 에러 입니다.
에러 발생하는 케이스를 만들어 봅니다.
USE database1;
DROP TABLE IF EXISTS tbl_collation_1;
CREATE TABLE tbl_collation_1 (
seq_no bigint NOT NULL AUTO_INCREMENT,
string1 varchar(20) NULL,
PRIMARY KEY (seq_no)
)
ENGINE=InnoDB;
DROP TABLE IF EXISTS tbl_collation_2;
CREATE TABLE tbl_collation_2 (
seq_no bigint NOT NULL AUTO_INCREMENT,
string2 varchar(20) NULL,
PRIMARY KEY (seq_no)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
두개의 테이블을 만드는데 한개는 tbl_collation_1 은 DB 기본값으로 생성이 됩니다.
두번째 테이블은 문자셋을 지정(DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci) 하여 만듭니다.
위처럼 문자셋이 다른 상태에서 비교 혹은 JOIN 을 하게 되면 해당 에러가 발생합니다.
INSERT INTO tbl_collation_1(string1) VALUES ('a');
INSERT INTO tbl_collation_1(string1) VALUES ('b');
INSERT INTO tbl_collation_2(string2) VALUES ('a');
INSERT INTO tbl_collation_2(string2) VALUES ('b');
SELECT *
FROM tbl_collation_1 A
INNER JOIN
tbl_collation_2 B
ON A.string1 = B.string2;
Error Code: 1267. Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_general_ci,IMPLICIT) for operation '=' 0.000 sec
위의 에러를 해결하려면 한쪽의 문자셋을 변경해 주면 됩니다.
SELECT *
FROM tbl_collation_1 A
INNER JOIN
tbl_collation_2 B
ON A.string1 collate utf8mb4_general_ci = B.string2;
처음부터 문자셋을 맞춰주고 하면 좋겠지만 무심코 그냥 생성을 하게 되면 DB 기본 설정값이 적용되기 때문에 서비스에 문제가 있을 수 있습니다.
workbench 의 경우 위의 세팅을 쉽게 확인 할 수 있는 기능이 있습니다.
두개 테이블의 collation 을 쉽게 확인 할 수 있습니다.
현재 적용되어 있는 table, provedure 등의 문자셋을 확인하려면 아래 기능을 이용하면 쉽습니다.
위의 문제를 해결하려면 테이블과 컬럼의 문자셋을 수정하면 됩니다.
ALTER TABLE tbl_collation_1 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE tbl_collation_1 MODIFY string1 varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL;
이후 아래와 같이 수정된 내용을 볼 수 있습니다.
위의 내용을 직접 명령어로 확인하려면 아래와 같이 실행합니다.
DB 확인
SELECT SCHEMA_NAME,
DEFAULT_CHARACTER_SET_NAME,
DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'database1';
DB 기본이 utf8mb4_0900_ai_ci 이기 때문에 특별하게 선언해 주지 않으면 utf8mb4_0900_ai_ci 로 생성됩니다.
테이블 확인
use database1;
SHOW TABLE STATUS WHERE NAME LIKE 'tbl_collation%';
DB 자체의 문자셋을 변경하려면 아래와 같이 합니다.
alter database database1 character set utf8mb4 collate utf8mb4_general_ci;
아래와 같이 변경이 되었습니다.
이 상태에서 테이블을 그냥 만들어 봅니다.
USE database1;
DROP TABLE IF EXISTS tbl_collation_3;
CREATE TABLE tbl_collation_3 (
seq_no bigint NOT NULL AUTO_INCREMENT,
string3 varchar(20) NULL,
PRIMARY KEY (seq_no)
)
ENGINE=InnoDB;
tbl_collation_3 은 DB 의 기본 문자셋이 utf8mb4_general_ci 이기 때문에 문제 없이 통일 되서 만들어 졌습니다.
PROCEDURE 에서 아무 문제가 없는데 workbench 에서 에러가 발생하는 경우가 있습니다.
이런 경우에는 connection collation 이 문제가 있습니다.
Procedure 만들때 "SET NAMES 'utf8mb4' COLLATE 'utf8mb4_general_ci';" 선언하고 생성하면 됩니다.
'개발 > Mysql' 카테고리의 다른 글
Mysql - Procedure Error Code: 1267. Illegal mix of collations workbench (0) | 2023.09.20 |
---|---|
Mysql - CREATE PROCEDURE (1) | 2023.09.18 |
Mysql - DATE_FORMAT(date,format) (0) | 2023.09.07 |