가장 안전한 방법은 열을 먼저 이진 형식으로 수정 한 다음 원하는 문자 집합을 사용하여 다시 해당 형식으로 수정하는 것입니다.
각 열 유형에는 다음과 같이 각각 이진 유형이 있습니다.
- CHAR => 이진
- 텍스트 => BLOB
- TINYTEXT => TINYBLOB
- MEDIUMTEXT => MEDIUMBLOB
- LONGTEXT => LONGBLOB
- VARCHAR => 바리 너리
예 :
ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARBINARY;
ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARCHAR(140) CHARACTER SET utf8mb4;
나는 여러 latin1 테이블에서 시도했으며 모든 분음 부호를 유지했습니다.
이 작업을 수행하는 모든 열에 대해이 쿼리를 추출 할 수 있습니다.
SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' VARBINARY;'),
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' ', COLUMN_TYPE,' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM information_schema.columns
WHERE TABLE_SCHEMA IN ('[TABLE_SCHEMA]')
AND COLUMN_TYPE LIKE 'varchar%'
AND (COLLATION_NAME IS NOT NULL AND COLLATION_NAME NOT LIKE 'utf%');
모든 열 에서이 작업을 수행하면 모든 테이블 에서이 작업을 수행합니다.
ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
모든 테이블에 대해이 쿼리를 생성하려면 다음 쿼리를 사용하십시오.
SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_COLLATION NOT LIKE 'utf8%'
and TABLE_SCHEMA in ('[TABLE_SCHEMA]');
이제 모든 열과 테이블을 수정 했으므로 데이터베이스에서 동일하게 수행하십시오.
ALTER DATABASE [DATA_BASE_NAME] CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;
utf8_unicode_ci
하지utf8_general_ci
.