[mysql] MySQL이 UTF-8을 올바르게 처리하도록하는 방법

어제 질문 에 대한 응답 중 하나는 데이터베이스가 UTF-8 문자를 올바르게 처리 할 수 ​​있는지 확인해야한다고 제안했습니다. MySQL로 어떻게 할 수 있습니까?



답변

최신 정보:

짧은 대답-거의 항상 utf8mb4문자 집합과 utf8mb4_unicode_ci데이터 정렬을 사용해야합니다 .

데이터베이스를 변경하려면 :

ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

보다:

원래 답변 :

MySQL 4.1 이상에는 UTF-8의 기본 문자 집합이 있습니다. my.cnf파일 에서이를 확인할 수 있으며 클라이언트와 서버 ( 및 )를 모두 설정 해야 합니다 .default-character-setcharacter-set-server

UTF-8로 변환하려는 기존 데이터가있는 경우 데이터베이스를 덤프하고 다음을 확인하여 다시 UTF-8로 가져옵니다.

  • SET NAMES utf8데이터베이스에 쿼리 / 삽입하기 전에 사용
  • DEFAULT CHARSET=utf8새 테이블을 만들 때 사용
  • 이 시점에서 MySQL 클라이언트와 서버는 UTF-8이어야합니다 (참조 my.cnf). 사용하는 언어 (예 : PHP)도 UTF-8이어야합니다. 일부 PHP 버전은 UTF-8을 인식하지 못하는 자체 MySQL 클라이언트 라이브러리를 사용합니다.

기존 데이터를 마이그레이션하려면 먼저 백업하십시오! 일이 계획대로 진행되지 않을 때 많은 이상한 데이터 절단이 발생할 수 있습니다!

일부 리소스 :


답변

이것을 ‘영구적’으로 만들려면 my.cnf:

[client]
default-character-set=utf8
[mysqld]
character-set-server = utf8

확인하려면 클라이언트로 이동하여 몇 가지 변수를 표시하십시오.

SHOW VARIABLES LIKE 'character_set%';

및 이어야하며 MySQL 설치의 어딘가를 가리키는을 utf8제외하고 모두인지 확인하십시오 ...._filesystembinary..._dir


답변

MySQL 4.1 이상에는 호출되는 기본 문자 집합이 utf8있지만 실제로는 UTF-8의 하위 집합 일뿐입니다 (3 바이트 이하 문자 만 허용).

utf8mb4“전체”UTF-8을 원하면 문자 세트로 사용하십시오 .


답변

짧은 대답 : utf8mb44 곳에서 사용 :

  • 클라이언트의 바이트는 latin1 / cp1251 / etc가 아니라 utf8입니다.
  • SET NAMES utf8mb4 또는 MySQL에 대한 클라이언트의 연결을 설정할 때 동등한 것
  • CHARACTER SET utf8mb4 모든 테이블 / 열에서-엄격하게 ascii / hex / country_code / zip_code / etc 인 열을 제외합니다.
  • <meta charset charset=UTF-8>HTML로 출력하는 경우. (예, 여기서 철자가 다릅니다.)

더 많은 정보 ;
끝까지 UTF8

위의 링크는 “모든 문제를 해결하려면 자세한 정식 답변이 필요합니다”를 제공합니다. -이 포럼에는 공간 제한이 있습니다.

편집하다

CHARACTER SET utf8mb4“모든”세계의 문자 를 포함하는 것 외에도 COLLATION utf8mb4_unicode_520_ci사용할 ‘가장 좋은 만능’조합 이라고 주장 할 수 있습니다. (해당 언어의 뉘앙스를 원하는 사람들을위한 터키어, 스페인어 등의 데이터 정렬도 있습니다.)


답변

charset은 데이터베이스 (기본값) 및 테이블의 속성입니다. 살펴볼 수 있습니다 (MySQL 명령) :

show create database foo; 
> CREATE DATABASE  `foo`.`foo` /*!40100 DEFAULT CHARACTER SET latin1 */

show create table foo.bar;
> lots of stuff ending with
> ) ENGINE=InnoDB AUTO_INCREMENT=252 DEFAULT CHARSET=latin1

다시 말해; 데이터베이스 문자 집합을 확인하거나 변경하는 것은 매우 쉽습니다.

ALTER TABLE `foo`.`bar` CHARACTER SET utf8;


답변

데이터베이스 자체의 문자 집합 인코딩을 UTF-8로 변경하려면 mysql> 프롬프트에 다음 명령을 입력합니다. USE ALTER DATABASE.. DBNAME을 데이터베이스 이름으로 바꿉니다.

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

이것은이 질문의 중복입니다 . 전체 MySQL 데이터베이스 문자 집합과 데이터 정렬을 UTF-8로 변환하는 방법은 무엇입니까?


답변

Javier의 솔루션을 따랐지만 my.cnf에 몇 가지 다른 줄을 추가했습니다.

[myslqd]
skip-character-set-client-handshake
collation_server=utf8_unicode_ci
character_set_server=utf8 

이 아이디어 는 페이지 하단의 첫 번째 / 유일한 사용자 의견에서 http://dev.mysql.com/doc/refman/5.0/en/charset-server.html 에서 발견했습니다 . 그는 skip-character-set-client-handshake 가 다소 중요하다고 언급합니다 .