[SQL] 어떻게 데이터베이스에 걸쳐 문자 세트 (및 정렬을) 변경하려면?
SQL어떻게 데이터베이스에 걸쳐 문자 세트 (및 정렬을) 변경하려면?
우리의 이전 프로그래머는 테이블 (MySQL을)의 잘못된 정렬을 설정합니다. 이 UTF8해야 할 때 그는 라틴어 데이터 정렬을 설정하고 지금은 문제가있다. 에 중국과 일본 문자 차례에 모든 기록 ??? 캐릭터.
데이터 정렬을 변경하고 캐릭터의 세부 사항을 다시 얻을 수 있습니까?
해결법
-
==============================
1.데이터베이스 데이터 정렬을 변경 :
데이터베이스 데이터 정렬을 변경 :
ALTER DATABASE <database_name> CHARACTER SET utf8 COLLATE utf8_unicode_ci;
테이블 정렬을 변경 :
ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
열 정렬을 변경 :
ALTER TABLE <table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci;
더 많은 정보:
-
==============================
2.Heres는 어떻게 모든 데이터베이스 / 테이블 / 컬럼을 변경합니다. 이러한 쿼리를 실행하고 출력 필요한 후속 쿼리의 모든 UTF8로 전체 스키마를 변환하는 것입니다. 도움이 되었기를 바랍니다!
Heres는 어떻게 모든 데이터베이스 / 테이블 / 컬럼을 변경합니다. 이러한 쿼리를 실행하고 출력 필요한 후속 쿼리의 모든 UTF8로 전체 스키마를 변환하는 것입니다. 도움이 되었기를 바랍니다!
- 변경 DATABASE 기본 정렬
SELECT DISTINCT concat('ALTER DATABASE `', TABLE_SCHEMA, '` CHARACTER SET utf8 COLLATE utf8_unicode_ci;') from information_schema.tables where TABLE_SCHEMA like 'database_name';
- 변경 표 정렬 / 문자 세트
SELECT concat('ALTER TABLE `', TABLE_SCHEMA, '`.`', table_name, '` CHARACTER SET utf8 COLLATE utf8_unicode_ci;') from information_schema.tables where TABLE_SCHEMA like 'database_name';
- 변경 COLUMN 정렬 / 문자 세트
SELECT concat('ALTER TABLE `', t1.TABLE_SCHEMA, '`.`', t1.table_name, '` MODIFY `', t1.column_name, '` ', t1.data_type , '(' , t1.CHARACTER_MAXIMUM_LENGTH , ')' , ' CHARACTER SET utf8 COLLATE utf8_unicode_ci;') from information_schema.columns t1 where t1.TABLE_SCHEMA like 'database_name' and t1.COLLATION_NAME = 'old_charset_name';
-
==============================
3.MySQL의에서 UTF8 문자 집합이 실제 UTF8 문자 집합의 부분 집합이라고 조심하십시오. 저장 1 바이트를 저장하기 위해 MySQL의 팀은 대신 전체 네 바이트의 UTF8 문자의 3 바이트를 저장하기로 결정했다. 일부 동아시아 언어와 이모티콘이 완벽하게 지원되지 않는다는 것을 의미한다. 당신이 모든 UTF8 문자를 저장하는 MySQL의에서 utf8mb4 데이터 유형 및 utf8mb4_bin 또는 utf8mb4_general_ci를 사용할 수 있도록합니다.
MySQL의에서 UTF8 문자 집합이 실제 UTF8 문자 집합의 부분 집합이라고 조심하십시오. 저장 1 바이트를 저장하기 위해 MySQL의 팀은 대신 전체 네 바이트의 UTF8 문자의 3 바이트를 저장하기로 결정했다. 일부 동아시아 언어와 이모티콘이 완벽하게 지원되지 않는다는 것을 의미한다. 당신이 모든 UTF8 문자를 저장하는 MySQL의에서 utf8mb4 데이터 유형 및 utf8mb4_bin 또는 utf8mb4_general_ci를 사용할 수 있도록합니다.
-
==============================
4.데이비드 휘태커는 무엇을 게시에 추가, 나는 전체 테이블과 열 각 테이블을 변환합니다 ALTER 문을 생성하는 쿼리를 만들었습니다. 실행하는 것이 좋습니다 수 있습니다
데이비드 휘태커는 무엇을 게시에 추가, 나는 전체 테이블과 열 각 테이블을 변환합니다 ALTER 문을 생성하는 쿼리를 만들었습니다. 실행하는 것이 좋습니다 수 있습니다
SET SESSION group_concat_max_len = 100000;
먼저 여기와 같이 확인하십시오 그룹 CONCAT는 아주 작은 제한을 초과하지 않습니다 확인합니다.
SELECT a.table_name, concat('ALTER TABLE ', a.table_schema, '.', a.table_name, ' DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci, ', group_concat(distinct(concat(' MODIFY ', column_name, ' ', column_type, ' CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ', if (is_nullable = 'NO', ' NOT', ''), ' NULL ', if (COLUMN_DEFAULT is not null, CONCAT(' DEFAULT \'', COLUMN_DEFAULT, '\''), ''), if (EXTRA != '', CONCAT(' ', EXTRA), '')))), ';') as alter_statement FROM information_schema.columns a INNER JOIN INFORMATION_SCHEMA.TABLES b ON a.TABLE_CATALOG = b.TABLE_CATALOG AND a.TABLE_SCHEMA = b.TABLE_SCHEMA AND a.TABLE_NAME = b.TABLE_NAME AND b.table_type != 'view' WHERE a.table_schema = ? and (collation_name = 'latin1_swedish_ci' or collation_name = 'utf8mb4_general_ci') GROUP BY table_name;
이전의 대답과 여기의 차이는 UTF8 대신 ut8mb4를 사용하여 열거 형에 대한 t1.CHARACTER_MAXIMUM_LENGTH와 함께 작업을 t1.data_type을하지 않았다 사용했다입니다. 또한, 그 이후 내 쿼리 제외 뷰는 별도로 변경된해야합니다.
간단히 말해서 나는 너무 오래 있었다 열을 (일반적으로 그들은 VARCHAR (256이었다)의 데이터는 일반적으로 단지 그들에 20 자했을 때 너무 쉽게 수정였습니다 고정 배열로 모든 달라져을 반환하는 펄 스크립트를 사용하고 그들을 반복 ).
나는 일부 데이터가 손상되었습니다 발견했을 때 변질 라틴에서 -> utf8mb4. 이 컬럼에서 UTF8 인코딩 라틴 문자 변환에 놓 쳤어받을 것으로 나타났다. 난 그저 내가 데이터를 해결하기 위해 변경하고이를 비교 생성 된 UPDATE 문 앞에서 후에 메모리에 문제가 될 줄 알았어 열에서 데이터를 개최했다.
-
==============================
5.여기 아니라 프로세스에 대해 설명합니다. 그러나, 라틴어 공간에 적합하지 않았다 일부 문자는 영원히 사라졌다. UTF-8은 라틴의 상위 집합입니다. 아니 반대. 대부분의 단일 바이트 공간에 맞게되지만, 정의되지 않은 사람이되지 않습니다 (라틴의 목록을 확인 - 모든 256 개 문자가 정의되어 있지 mysql을의 라틴 정의에 따라)
여기 아니라 프로세스에 대해 설명합니다. 그러나, 라틴어 공간에 적합하지 않았다 일부 문자는 영원히 사라졌다. UTF-8은 라틴의 상위 집합입니다. 아니 반대. 대부분의 단일 바이트 공간에 맞게되지만, 정의되지 않은 사람이되지 않습니다 (라틴의 목록을 확인 - 모든 256 개 문자가 정의되어 있지 mysql을의 라틴 정의에 따라)
from https://stackoverflow.com/questions/5906585/how-to-change-the-character-set-and-collation-throughout-a-database by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 호출은 커서를 사용하지 않고 각 행에 대해 저장 프로 시저 (0) | 2020.03.29 |
---|---|
[SQL] 가장 빠른 방법은 매우 큰 테이블의 행의 정확한 수를 계산하려면? (0) | 2020.03.29 |
[SQL] 무엇 MySQL의 데이터베이스 테이블 및 관계 조건 질문과 Q & A 설문 조사를 지원하는 것? [닫은] (0) | 2020.03.29 |
[SQL] 어떻게 오라클의 테이블에서 중복 값을 찾을 수 있습니까? (0) | 2020.03.29 |
[SQL] OR은 SQL Server의 CASE 문이 지원되지 않습니다 (0) | 2020.03.29 |