전체 MySQL 데이터베이스 문자 세트를 UTF-8로 변환하고 데이터 정렬을 UTF-8로 변환하려면 어떻게해야합니까?
답변
ALTER DATABASE
및 ALTER TABLE
명령을 사용하십시오 .
ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
또는 4 바이트 UTF-8을 지원하지 않는 MySQL 5.5.2 이상을 계속 사용 utf8
하는 경우 다음 대신 사용하십시오 utf8mb4
.
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
답변
-
백업하십시오!
-
그런 다음 데이터베이스에서 기본 문자 세트를 설정해야합니다. 기존 테이블을 변환하지 않고 새로 작성된 테이블의 기본값 만 설정합니다.
ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
-
그런 다음 모든 기존 테이블 및 해당 열의 문자 세트를 변환해야합니다. 이것은 현재 데이터가 실제로 현재 문자 세트에 있다고 가정합니다. 열이 하나의 문자 세트로 설정되었지만 데이터가 실제로 다른 문자 세트에 저장된 경우 이를 처리하는 방법에 대한 MySQL 설명서 를 확인해야합니다 .
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
답변
명령 행 쉘에서
커맨드 라인 쉘이라면 매우 빠르게 할 수 있습니다. “dbname”을 입력하십시오. : D
DB="dbname"
(
echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names \
| xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"
간단한 복사 / 붙여 넣기를위한 하나의 라이너
DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"
답변
SQL을 작성하여 다음을 사용하여 모든 테이블을 업데이트 할 수 있습니다.
SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET utf8 COLLATE utf8_general_ci; ",
"ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ")
AS alter_sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = your_database_name;
출력을 캡처하여 실행하십시오.
위의 아놀드 다니엘스의 대답은 더 우아합니다.
답변
계속하기 전에 다음을 확인하십시오. 전체 데이터베이스 백업을 완료했습니다!
1 단계 : 데이터베이스 레벨 변경
-
데이터베이스의 데이터 정렬 및 문자 세트 식별
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA S WHERE schema_name = 'your_database_name' AND (DEFAULT_CHARACTER_SET_NAME != 'utf8' OR DEFAULT_COLLATION_NAME not like 'utf8%');
-
데이터베이스의 데이터 정렬 수정
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
2 단계 : 테이블 레벨 변경
-
문자 세트 또는 데이터 정렬이 잘못된 데이터베이스 테이블 식별
SELECT CONCAT( 'ALTER TABLE ', table_name, ' CHARACTER SET utf8 COLLATE utf8_general_ci; ', 'ALTER TABLE ', table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ') FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C WHERE C.collation_name = T.table_collation AND T.table_schema = 'your_database_name' AND (C.CHARACTER_SET_NAME != 'utf8' OR C.COLLATION_NAME not like 'utf8%')
-
테이블 열의 데이터 정렬 및 문자 집합 조정
상위 SQL 출력을 캡처하여 실행하십시오. (다음과 같이)
ALTER TABLE rma CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE rma_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE rma_products CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_products CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE rma_report_period CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_report_period CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE rma_reservation CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_reservation CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE rma_supplier_return CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE rma_supplier_return_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE rma_supplier_return_product CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_product CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
답변
HeidiSQL을 사용하십시오 . 무료이며 매우 유용한 db 도구입니다.
도구 메뉴에서 대량 테이블 편집기를 입력하십시오.
전체 데이터베이스를 선택하거나 변환 할 테이블을 선택하십시오.
- 기본 데이터 정렬 변경 : utf8mb4_general_ci
- 틱 문자셋으로 변환 : utf8
실행
단 몇 초만에 전체 데이터베이스가 라틴어에서 utf8로 변환됩니다.
매력처럼 작동합니다 🙂
HeidiSQL은 기본적으로 utf8로 연결되므로 특수 문자는 이제 테이블 데이터를 검사 할 때 인코딩 된 문자가 아닌 문자 (æ ø å)로 표시되어야합니다.
라틴어에서 utf8로 이동할 때의 실제 함정은 pdo가 utf8 문자셋과 연결되도록하는 것입니다. 그렇지 않으면 웹 페이지의 모든 곳에서 utf8 테이블과 물음표에 쓰레기 데이터가 삽입되어 테이블 데이터가 utf8이 아니라고 생각하게됩니다 …
답변
@ sdfor 의견에서 영감을 얻은 다음은 작업을 수행하는 bash 스크립트입니다.
#!/bin/bash
printf "### Converting MySQL character set ###\n\n"
printf "Enter the encoding you want to set: "
read -r CHARSET
# Get the MySQL username
printf "Enter mysql username: "
read -r USERNAME
# Get the MySQL password
printf "Enter mysql password for user %s:" "$USERNAME"
read -rs PASSWORD
DBLIST=( mydatabase1 mydatabase2 )
printf "\n"
for DB in "${DBLIST[@]}"
do
(
echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
mysql "$DB" -u"$USERNAME" -p"$PASSWORD" -e "SHOW TABLES" --batch --skip-column-names \
| xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
) \
| mysql "$DB" -u"$USERNAME" -p"$PASSWORD"
echo "$DB database done..."
done
echo "### DONE ###"
exit