MySQL 다중 테이블 조인 오류는 다음과 같습니다: [Err]1267 – '=
작업에 대한 데이터 정렬(utf8_general_ci,IMPLICIT) 및 (utf8_unicode_ci,IMPLICIT)의 잘못된 혼합, 즉 데이터 정렬 규칙(COLLATION)은 다음과 같습니다. 두 테이블이 다르므로 비교를 완료할 수 없습니다. COLLATION은 정렬 및 크기 비교에 사용됩니다. 문자 세트에는 하나 이상의 COLLATION이 있으며 _ci(대소문자 구분 안 함), _cs(대소문자 구분) 또는 _bin(이진)으로 끝납니다. 비교를 수행할 때 두 테이블의 문자 순서가 동일한지 확인해야 합니다. 일반적으로 테이블을 생성할 때 지정하지 않고 기본값을 사용하면 됩니다. 모든 테이블이 기본으로 설정되어 있으면 문제가 없습니다. 이 기사에서는 주로 MySQL 테이블 정렬 규칙의 다양한 오류 분석을 소개합니다. 이것이 모든 사람에게 도움이 되기를 바랍니다.
다양한 시나리오를 시뮬레이션해 보겠습니다. 테이블 구조는 다음과 같습니다(utf8의 기본 데이터 정렬은 utf8_general_ci입니다).
mysql> show create table test.cs\G *************************** 1. row *************************** Table: cs Create Table: CREATE TABLE `cs` ( `id` int(11) DEFAULT NULL, `name` varchar(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.01 sec)
테이블 기본 데이터 정렬 세트 보기
mysql> select TABLE_SCHEMA,TABLE_NAME,TABLE_COLLATION from information_schema.tables where table_name='cs'; +--------------+------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | TABLE_COLLATION | +--------------+------------+-----------------+ | test | cs | utf8_general_ci | +--------------+------------+-----------------+ 1 row in set (0.00 sec)
열 데이터 정렬 세트 보기
mysql> select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME from information_schema.COLUMNS where TABLE_NAME='cs'; +--------------+------------+-------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | COLLATION_NAME | +--------------+------------+-------------+-----------------+ | test | cs | id | NULL | | test | cs | name | utf8_general_ci | +--------------+------------+-------------+-----------------+ 2 rows in set (0.00 sec)
utf8에서 utf8mb4로의 업그레이드는 다음과 같이 온라인 ddl을 지원하지 않습니다.
mysql> ALTER TABLE cs CONVERT TO CHARACTER SET utf8mb4,ALGORITHM=INPLACE,LOCK=NONE; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
utf8.utf8_general_ci에서 utf8.utf8_unicode_ci로의 변경은 다음과 같이 온라인 ddl을 지원하지 않습니다.
mysql> ALTER TABLE cs CONVERT TO CHARACTER SET utf8 collate utf8_unicode_ci,ALGORITHM=INPLACE,LOCK=NONE; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
만약 이렇게 문자셋을 수정하면, 컬럼 레벨은 바뀌지 않고 테이블 레벨만 변경되는 것을 볼 수 있습니다.
mysql> ALTER TABLE cs CHARACTER SET utf8 collate utf8_unicode_ci; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> select TABLE_SCHEMA,TABLE_NAME,TABLE_COLLATION from information_schema.tables where table_name='cs'; +--------------+------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | TABLE_COLLATION | +--------------+------------+-----------------+ | test | cs | utf8_unicode_ci | +--------------+------------+-----------------+ 1 row in set (0.00 sec) mysql> select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME from information_schema.COLUMNS where TABLE_NAME='cs'; +--------------+------------+-------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | COLLATION_NAME | +--------------+------------+-------------+-----------------+ | test | cs | id | NULL | | test | cs | name | utf8_general_ci | +--------------+------------+-------------+-----------------+ 2 rows in set (0.00 sec)
실제로 문자 집합을 변경할 때 다음과 같이 CONVERT TO를 추가하는 것을 잊지 마세요.
mysql> ALTER TABLE cs CONVERT TO CHARACTER SET utf8 collate utf8_unicode_ci; Query OK, 5 rows affected (0.06 sec) Records: 5 Duplicates: 0 Warnings: 0 mysql> select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME from information_schema.COLUMNS where TABLE_NAME='cs'; +--------------+------------+-------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | COLLATION_NAME | +--------------+------------+-------------+-----------------+ | test | cs | id | NULL | | test | cs | name | utf8_unicode_ci | +--------------+------------+-------------+-----------------+ 2 rows in set (0.00 sec)
테이블의 기본 문자 집합만 변경하려면 다음 문을 사용해야 합니다.
mysql> ALTER TABLE cs default CHARACTER SET utf8 collate utf8_general_ci,ALGORITHM=INPLACE,LOCK=NONE; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> select TABLE_SCHEMA,TABLE_NAME,TABLE_COLLATION from information_schema.tables where table_name='cs'; +--------------+------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | TABLE_COLLATION | +--------------+------------+-----------------+ | test | cs | utf8_general_ci | +--------------+------------+-----------------+ 1 row in set (0.00 sec) mysql> select TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,COLLATION_NAME from information_schema.COLUMNS where TABLE_NAME='cs'; +--------------+------------+-------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | COLLATION_NAME | +--------------+------------+-------------+-----------------+ | test | cs | id | NULL | | test | cs | name | utf8_unicode_ci | +--------------+------------+-------------+-----------------+ 2 rows in set (0.00 sec)
열 문자 집합은 변경되지 않았으며, 기본적으로 새 열만 테이블 문자 집합(utf8.utf8_general_ci)을 상속받는 것을 확인할 수 있습니다.
관련 권장 사항:
MySQL 테이블의 네 가지 파티션 유형에 대한 자세한 코드 설명
php mysql 테이블의 중국어 왜곡 문제를 해결하는 방법
위 내용은 다양한 MySQL 테이블 정렬 규칙으로 인한 오류 보고서 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!