>  기사  >  데이터 베이스  >  다양한 MySQL 테이블 정렬 규칙으로 인한 오류 보고서 분석

다양한 MySQL 테이블 정렬 규칙으로 인한 오류 보고서 분석

小云云
小云云원래의
2017-12-14 11:49:311681검색

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 테이블의 네 가지 파티션 유형에 대한 자세한 코드 설명

mysql 테이블 연결 사용 방법

php mysql 테이블의 중국어 왜곡 문제를 해결하는 방법

위 내용은 다양한 MySQL 테이블 정렬 규칙으로 인한 오류 보고서 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.