[mysql] 전체 MySQL 데이터베이스 문자 집합 및 데이터 정렬을 UTF-8로 변환하는 방법은 무엇입니까?

전체 MySQL 데이터베이스 문자 세트를 UTF-8로 변환하고 데이터 정렬을 UTF-8로 변환하려면 어떻게해야합니까?



답변

ALTER DATABASEALTER 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;


답변

  1. 백업하십시오!

  2. 그런 다음 데이터베이스에서 기본 문자 세트를 설정해야합니다. 기존 테이블을 변환하지 않고 새로 작성된 테이블의 기본값 만 설정합니다.

    ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
  3. 그런 다음 모든 기존 테이블 및 해당 열의 문자 세트를 변환해야합니다. 이것은 현재 데이터가 실제로 현재 문자 세트에 있다고 가정합니다. 열이 하나의 문자 세트로 설정되었지만 데이터가 실제로 다른 문자 세트에 저장된 경우 이를 처리하는 방법에 대한 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; 

참조 : https://confluence.atlassian.com/display/CONFKB/How+to+Fix+the+Collation+and+Character+Set+of+a+MySQL+Database


답변

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