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


459

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


22
나중에 방문자에게 다음 주 관련 질문에 사이드 바 및 사용을 utf8_unicode_ci하지 utf8_general_ci.
fuxia

14
당신은 전체 UTF-8 지원을 원하는 경우에 당신은 아마 또한의 문자 집합 사용하려는 것 utf8mb4보다는이 utf8같은 utf8단지 전체 범위 반대로 기본 다국어 평면을 지원합니다. MySQL 5.5.3 이상이 필요합니다.
Martin Steel

4
위의 내 의견에서 언급을 잊어 버렸습니다. 전환 utf8mb4하면 데이터 정렬을 전환해야합니다.utf8mb4_unicode_ci
Martin Steel

3
collation utf8mb4_unicode_520_ci또는 사용 가능한 최신 버전이 더 좋습니다 .
Rick James

@MartinSteel 나는 그것이 기본적으로 해당 문자 집합과의 데이터 정렬이라고 생각합니다.
VaTo

답변:


715

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;

12
CONVERT TO기술은 텍스트가 다른 문자셋 (예 : latin1) 에 올바르게 저장되었고 엉켜 있지 않은 것으로 가정합니다 (예 : latin1로 변환하지 않고 latin1 열에 채워진 UTF-8 바이트).
Rick James

1
이렇게하면 테이블이 재 구축되어 대규모 생산 시스템에서 실행할 수 없게됩니다. latin1 열에 ASCII 문자 만 저장되어 있다고 확신하는 경우 다시 작성하지 않고 테이블 문자 집합 / 데이터 정렬을 변경할 수 있습니까?
앤드류

@Andrew 대규모 프로덕션 시스템에는 일반적으로 유지 관리를 위해 미러링 된 DB가 있습니다.
BalusC

1
charcter를 utf8로 변경하면 데이터 유형이 텍스트에서 중간 텍스트로 변경됩니다. 예상 되나요?
Jerry

1
@Jerry 아마도 다음과 같은 이유 일 것입니다. "열이 utf8로 변환되면 각 문자는 최대 길이가 3 × 65,535 = 196,605 바이트 인 경우 최대 3 바이트가 필요할 수 있습니다.이 길이는 TEXT 열의 길이 바이트에 맞지 않습니다. MySQL은 데이터 유형을 길이 바이트가 196,605의 값을 기록 할 수있는 가장 작은 문자열 유형 인 MEDIUMTEXT로 변환합니다. 마찬가지로 VARCHAR 컬럼은 MEDIUMTEXT로 변환 될 수 있습니다. " 문자 집합 변경
jabbascript

129
  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;

44
참고 : ALTER TABLE tablename CHARACTER SET utf8은 새로 작성된 열에 사용되는 테이블의 기본 문자 세트 만 설정합니다. 이미 문자 집합이있는 기존 열은 변환하지 않습니다.
newspire

백업 백업 백업을 먼저 읽어야했지만 개발 환경에 있다는 것이 행운이었습니다. 내 공감대가 당신에게 간다!
DominikAngerer 2014

4
@DominikAngerer : 무슨 파산?
cic

16
참고 utf8_general_ci더 이상 모범 사례를 권장합니다. MySQL 5.5.3부터는 utf8mb4보다는 을 사용해야한다 utf8. 둘 다 UTF-8 인코딩을 참조하지만 이전 버전 utf8에는 위에 번호가 매겨진 문자의 사용을 막는 MySQL 관련 제한이있었습니다 0xFFFD.
u01jmg3

76

명령 행 쉘에서

커맨드 라인 쉘이라면 매우 빠르게 할 수 있습니다. "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"

2
내가 얻는 것에 대해 더 자세히 설명해 주 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DB="dbname"
시겠습니까

@ 4485670 명령 행 쉘 에서이를 실행해야합니다 . MySQL 클라이언트 연결 만 사용할 수있는 경우 아래 sdfor 코드를 사용하십시오.
아놀드 다니엘스

6
이 코드는 훌륭하게 작동합니다. 필요한 경우 mysql 뒤에 -h [hostname] -u [username] -p [password]를 추가해야합니다.
분산

3
실제 시스템에서 외래 키 검사를 비활성화하고 싶을 것입니다 : DB="db_name"; ( echo 'ALTER DATABASE ' "$ DB"'`CHARACTER SET utf8 COLLATE utf8_general_ci; '; mysql --uuser -ppassword -hhost "$ DB"-e "SHOW TABLES"--batch --skip-column-names | xargs -I {} echo 'SET foreign_key_checks = 0; '{}'문자 세트로 변경 테이블 변경 utf8 COLLATE utf8_general_ci; ' ) | mysql -uuser -ppassword -hhost "$ DB"`
Adam Nelson

1
"SHOW TABLES"대신 "Table_Type = 'BASE TABLE'인 전체 테이블 표시"를 사용하기 전까지는 작동하지 않았습니다.
Brian Peterson

68

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;

출력을 캡처하여 실행하십시오.

위의 아놀드 다니엘스의 대답은 더 우아합니다.


왜 alter table 쿼리를 두 개 추가했는지? 충분하지 않습니까?
Akshay

7
@Akshay, 좋은 질문입니다. 첫 번째 대체 테이블 쿼리는 새 열의 기본값을 설정하고 두 번째 대체 테이블 쿼리는 기존 열을 변환합니다.
UnlimitedInfinity

4
참고 : dev.mysql.com/doc/refman/5.5/en/alter-table.html MySQL 문서 에 따르면 ALTER 문의 "CONVERT TO CHARACTER SET"버전은 한 단계에서 모두 수행됩니다. "테이블 기본값을 변경하려면 문자 세트 모든 문자 열 (CHAR, VARCHAR, TEXT)을 새 문자 세트로 변환 ...
devGuy

2
이 오류 # 1054- 'where clause'에 알 수없는 'webdb_playground'열이 있지만 내 데이터베이스가 올바른 것입니다.
Yannis Dran

1
@YannisDran WHERE TABLE_SCHEMA=webdb_playground알 수없는 열 오류가 발생했지만 WHERE TABLE_SCHEMA="webdb_playground"성공했을 수있는 db 이름이 문자열에 없을 수 있습니다. 다른 누군가가 그 문제에 부딪 칠 경우를 대비해 뭔가를 시도하십시오.
jabbascript

17

계속하기 전에 다음을 확인하십시오. 전체 데이터베이스 백업을 완료했습니다!

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


1
현재이 스크립트는 db에는 'utf8_unicode_ci'를 사용하지만 테이블에는 'utf8_general_ci'를 사용합니다. 의도적 인 것입니까? (모두 동일한 문자셋을 사용해야한다고 생각합니다)
gmcnaughton

stackoverflow.com/questions/10957238/… 여기에 더 큰 대답을 남겼습니다
VH

8

HeidiSQL을 사용하십시오 . 무료이며 매우 유용한 db 도구입니다.

도구 메뉴에서 대량 테이블 편집기를 입력하십시오.

전체 데이터베이스를 선택하거나 변환 할 테이블을 선택하십시오.

  • 기본 데이터 정렬 변경 : utf8mb4_general_ci
  • 틱 문자셋으로 변환 : utf8

실행

단 몇 초만에 전체 데이터베이스가 라틴어에서 utf8로 변환됩니다.

매력처럼 작동합니다 :)

HeidiSQL은 기본적으로 utf8로 연결되므로 특수 문자는 이제 테이블 데이터를 검사 할 때 인코딩 된 문자가 아닌 문자 (æ ø å)로 표시되어야합니다.

라틴어에서 utf8로 이동할 때의 실제 함정은 pdo가 utf8 문자셋과 연결되도록하는 것입니다. 그렇지 않으면 웹 페이지의 모든 곳에서 utf8 테이블과 물음표에 쓰레기 데이터가 삽입되어 테이블 데이터가 utf8이 아니라고 생각하게됩니다 ...


좀 더 자세히 설명해 주시겠습니까? 나는이 문제를 정확히 가지고 있습니다-특수 문자와 공백은 물음표로 나타납니다. PHPMyAdmin을 사용하여 MAMP에서 데이터베이스를 변환하려고합니다. 오프라인으로 개발 한 후 호스트가 utf8mb4를 지원하지 않음을 알게되었습니다. Windows가 없으므로 HeidiSQL을 사용할 수 없습니다. PHPMyAdmin으로 이것을 달성 할 수있는 방법이 있습니까?
RexTheRunt

이런 식으로. 특히 많은 테이블이 있습니다.
tyan

CHARSET을 변환하려고 할 때 오류가 발생합니다. SQL 오류 (1025) : 이름을 바꿀 때 오류가 발생하지만 놀라운 SQL 관리자 도구입니다!
marcolopes

heidisql에 대한 좋은 개요와 자습서가 필요한 사람은 이 기사를 확인하십시오 .
DougB

6

@ 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

4

데이터가 동일한 문자 세트에없는 경우 http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html 에서이 스 니펫을 고려할 수 있습니다.

열에 이진이 아닌 데이터 형식 (CHAR, VARCHAR, TEXT)이 있으면 해당 내용은 다른 문자 집합이 아닌 열 문자 집합으로 인코딩되어야합니다. 내용이 다른 문자 집합으로 인코딩 된 경우 먼저 이진 데이터 형식을 사용하도록 열을 변환 한 다음 원하는 문자 집합이있는 비 이진 열로 변환 할 수 있습니다.

예를 들면 다음과 같습니다.

 ALTER TABLE t1 CHANGE c1 c1 BLOB;
 ALTER TABLE t1 CHANGE c1 c1 VARCHAR(100) CHARACTER SET utf8;

올바른 데이터 정렬을 선택해야합니다. 그렇지 않으면 고유 한 키 충돌이 발생할 수 있습니다. 예를 들어, Éleanore와 Eleanore는 일부 데이터 정렬에서 동일하게 간주 될 수 있습니다.

곁에:

데이터베이스에서 UTF-8로 저장된 경우에도 특정 문자가 전자 메일에서 "파손 된"상황이있었습니다. utf8 데이터를 사용하여 이메일을 보내는 경우 이메일을 UTF8로 보내도록 변환 할 수도 있습니다.

PHPMailer에서 다음 줄을 업데이트하십시오. public $CharSet = 'utf-8';


4

테이블 수가 많은 데이터베이스의 경우 간단한 php 스크립트를 사용하여 다음을 사용하여 데이터베이스 및 모든 테이블의 문자 세트를 업데이트 할 수 있습니다.

$conn = mysqli_connect($host, $username, $password, $database);

if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

$alter_database_charset_sql = "ALTER DATABASE ".$database." CHARACTER SET utf8 COLLATE utf8_unicode_ci";
mysqli_query($conn, $alter_database_charset_sql);

$show_tables_result = mysqli_query($conn, "SHOW TABLES");
$tables  = mysqli_fetch_all($show_tables_result);

foreach ($tables as $index => $table) {
  $alter_table_sql = "ALTER TABLE ".$table[0]." CONVERT TO CHARACTER SET utf8  COLLATE utf8_unicode_ci";
  $alter_table_result = mysqli_query($conn, $alter_table_sql);
  echo "<pre>";
  var_dump($alter_table_result);
  echo "</pre>";
}

이 스크립트는 어디에서 실행합니까?
Yannis Dran

1
@YannisDran IP를 실행하는 IP가 데이터베이스에 액세스 할 수있는 한 중요하지 않습니다. 먼저 백업을 확인하십시오!
Dan Lucas

좋습니다. 어떻게 실행합니까? 서버에 업로드 한 다음 해당 위치의 경로를 입력해야합니까?
Yannis Dran

4
DELIMITER $$  

CREATE PROCEDURE `databasename`.`update_char_set`()  

BEGIN  
 DECLARE done INT DEFAULT 0;  
 DECLARE t_sql VARCHAR(256);  
 DECLARE tableName VARCHAR(128);  
 DECLARE lists CURSOR FOR SELECT table_name FROM `information_schema`.`TABLES` WHERE table_schema = 'databasename';  
 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;  
 OPEN lists;  
 FETCH lists INTO tableName;  
 REPEAT  
    SET @t_sql = CONCAT('ALTER TABLE ', tableName, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci');  
    PREPARE stmt FROM @t_sql;  
    EXECUTE stmt;  
    DEALLOCATE PREPARE stmt;  
 FETCH lists INTO tableName;  
 UNTIL done END REPEAT;  
 CLOSE lists;  
END$$  

DELIMITER ;  

CALL databasename.update_char_set();

고마워, 이것은 전체 데이터베이스 (예 : 각 테이블)에 실제로 수행하는 방법을 보여주는 몇 가지 답변 중 하나입니다. 매력처럼 일했다.
Machisuji

3
mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql
cp dump.sql dump-fixed.sql
vim dump-fixed.sql


:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql

3

가장 안전한 방법은 열을 먼저 이진 형식으로 수정 한 다음 원하는 문자 집합을 사용하여 다시 해당 형식으로 수정하는 것입니다.

각 열 유형에는 다음과 같이 각각 이진 유형이 있습니다.

  1. CHAR => 이진
  2. 텍스트 => BLOB
  3. TINYTEXT => TINYBLOB
  4. MEDIUMTEXT => MEDIUMBLOB
  5. LONGTEXT => LONGBLOB
  6. 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;

1

테이블을 변환 할 수 없거나 테이블이 항상 UTF8이 아닌 문자 세트로 설정되었지만 utf8을 원한다면 테이블을 지우고 다시 시작하고 명시 적으로 지정하는 것이 가장 좋습니다.

create database database_name character set utf8;

0

나를 위해 일한 유일한 솔루션 : http://docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8

테이블이 포함 된 데이터베이스 변환

mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql

cp dump.sql dump-fixed.sql
vim dump-fixed.sql

:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql

0

테이블 변경 table_name charset = 'utf8';

이것은 내 경우에 사용할 수있는 간단한 쿼리이므로 요구 사항에 따라 table_name을 변경할 수 있습니다.


일반적으로 답변에는 제안한 사항에 대한 설명이 수반되어야합니다.
RiggsFolly

0

데이터베이스 자체에 대해 문자 세트 인코딩을 UTF-8로 변경하려면 mysql> 프롬프트에서 다음 명령을 입력하십시오. DBNAME을 데이터베이스 이름으로 바꾸십시오.

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

0

DB 도구 Navicat을 사용하면 더 쉽게 할 수 있습니다.

  • 시바.

데이터베이스를 마우스 오른쪽 단추로 클릭하고 드롭 다운에서 원하는대로 DB 특성 및 변경을 선택하십시오.

여기에 이미지 설명을 입력하십시오


0

명령 줄 솔루션 및 제외보기

나는 단순히 다른 사람들을 위해 @Jasny의 대답 을 완성 하고 있습니다.@Brian 데이터베이스에 대한 견해를 가진 하고 있습니다.

다음과 같은 오류가있는 경우 :

ERROR 1347 (HY000) at line 17: 'dbname.table_name' is not of type 'BASE TABLE'

보기가있을 수 있으므로 제외해야하기 때문입니다. 그러나 제외하려고하면 MySQL은 1 대신 2 개의 열을 반환합니다.

SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE';
-- table_name1  BASE TABLE
-- table_name2  BASE TABLE

따라서 Jasny의 명령을 조정 awk하여 테이블 이름이 포함 된 첫 번째 열만 추출해야합니다.

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names \
    | awk '{print $1 }' \
    | 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 FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names | awk '{print $1 }' | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"

-1

문자 세트 인코딩을 UTF-8로 변경하려면 PHPMyAdmin의 간단한 단계를 수행하십시오.

  1. 데이터베이스를 선택하십시오 SS

  2. 운영으로 이동 SS

  3. 작업 탭의 하단 데이터 정렬 드롭 다운 메뉴에서 원하는 인코딩 (utf8_general_ci)을 선택하고 (1) 모든 테이블 데이터 정렬 변경, (2) 모든 테이블 열 데이터 정렬 변경 확인란을 선택하십시오. 그리고 Go를 누르십시오.

SS

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.