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


102

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


4
정말 우리가 등 다양한 MySQL의 버전 호환성, 커버, 포괄적 인 답변을 얻을 희망
에드워드 Z. 양을


1
@ EdwardZ.Yang-MySQL 4.1 도입 CHARACTER SETs; 5.1.24는 독일어 sharp-s (ß)의 데이터 정렬을 엉망으로 만들었습니다. 5.1.62에 다른 데이터 정렬을 추가하여 수정되었습니다. 5.5.3은 utf8을 새 문자 세트 utf8mb4로 채웠습니다.
릭 제임스

1
이 질문은 이것과 아주 동일합니다 .. 그 제발 봐 stackoverflow.com/questions/3513773/...
Nyein 아웅

이러한 대답의 대부분은 명백히 잘못되었다는 점을 지적 할 가치가 있습니다. 사용하지 마십시오 utf8. 최대 3 바이트 문자 만 지원합니다. MySQL에서 사용해야하는 올바른 문자 집합은 utf8mb4.
Brendan Byrd

답변:


89

최신 정보:

짧은 대답-거의 항상 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 클라이언트 라이브러리를 사용합니다.

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

일부 리소스 :


29
내 이해는 utf8MySQL 내에서 전체 유니 코드의 작은 하위 집합 만 참조한다는 것입니다. utf8mb4대신 전체 지원을 강제로 사용해야 합니다. mathiasbynens.be/notes/mysql-utf8mb4를 참조하십시오 . "오랫동안 데이터베이스, 테이블 및 열에 대해 MySQL의 utf8 문자 세트를 사용 했으며 위에서 설명한 UTF-8 인코딩에 매핑 되었다고 가정 했습니다."
아론 McDaid

7
MySQL에는 UTF-8의 기본 문자 집합이 없었습니다. 최신 5.7 모두 사용하도록 4.1 및 5.x의 latin1latin1_swedish_ci기본 문자 집합 및 정렬합니다. 확인을 위해 MySQL의 설명서에 "서버 문자 집합 및 데이터 정렬"페이지를 참조하십시오 : dev.mysql.com/doc/refman/5.1/en/charset-server.html
애니미즘

2
@TimTisdall utf8mb4대부분의 텍스트가 ASCII 일 때 추가 저장 용량을 차지하는 것에 대해 걱정할 필요가 없습니다 . char문자열은 사전 할당 되지만 varchar그렇지 않습니다 . 이 문서 페이지 의 마지막 몇 줄을 참조하십시오 . 예를 들어, char(10)utf8mb4에서 40 바이트를 비관적으로 예약하지만 varchar(10)가변 길이 인코딩에 따라 바이트를 할당합니다.
Kevin A. Naudé 2014 년

1
@Kevin 나는 당신이 그것을 잘못 읽었다 고 생각합니다. 최대 행 길이는 64k라고 생각합니다. 그 양의 공간을 예약해야했기 때문에 utf8mb4 필드의 1/4 만 만들 수 있습니다. 따라서 ASCII라도 16k 문자 만 삽입 할 수 있습니다.
Tim Tisdall 2014 년

1
@TimTisdall 오, 당신은 상한에 대해 이야기하고 있습니다. 예, 더 낮습니다. 다행히도 현재 버전의 mysql은 (경고를 내면서) 필드를 가능한 바이트 크기보다 크게 변경하려고하면 varchar(n)에서 text데이터 유형 으로 자동 업그레이드됩니다 varchar(n). 인덱스는 또한 하한 최악의 경우 상한을 가지며 다른 문제가 발생할 수 있습니다.
Kevin A. Naudé 2014 년

44

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

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

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

SHOW VARIABLES LIKE 'character_set%';

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


내 경우에는 작동하지 않았지만 어쨌든 주어진 내용으로 / etc에 my.cf 파일을 만들었습니다. 나는 사용create table my_name(field_name varchar(25) character set utf8);
Marek Bar

"SHOW VARIABLES LIKE 'character_set %';" 명령은 내 연결에 문제가 있음을 보여주었습니다. 감사!
javsmo

1
이것은 올바르지 않습니다. MySQL이 호출 utf8하는 것은 "전체"UTF-8이 아닙니다.
TWR Cole

32

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

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


5
확실히 동의합니다. 이것이 유일한 정답입니다. utf8이모티콘과 같은 문자는 포함되지 않습니다. utf8mb4않습니다. 업데이트 방법에 대한 자세한 내용은 다음을 확인하십시오. mathiasbynens.be/notes/mysql-utf8mb4
jibai31

@Basti-대부분 정확하고 (latin1은 최근까지 기본값 임) 완전하지 않습니다 (utf8로 인코딩 된 데이터를 올바르게 삽입 / 선택하거나 html로 표시하는 것에 대해 논의하지 않음).
릭 제임스

정중하게, @RickJames, Basti는 "지금까지"라고 말했습니다.이 글을 올렸을 때 귀하의 답변을 본 기억이 없습니다.
TWR Cole

아아, utf8 문제에는 약 5 개의 뚜렷하게 다른 증상이 있으며 프로그래머가 문제를 일으키기 위해 잘못하는 약 4 가지가 있습니다. 대부분의 답변 은 수정이 필요한 가지만 지적합니다. 원래 질문은 광범위한 질문 이었으므로 답은 모두 4 개가 필요했습니다. 아마도 Basti는 한 가지 측면이 해결책 인 한 가지 증상에 익숙했을 것 입니다.
릭 제임스

8
제쳐두고 잠시 멈춰서 MySQL 팀에게 정말 훌륭하고 강렬한 시선을주고 싶습니다. o_o WTF 생각 했어? 실제로 UTF-8이 아닌 "utf8"이라는 코드 페이지를 프로그램에 만들어서 얼마나 혼란 스러웠는지 알고 있습니까? 젠장. </ rant>
TWR Cole

20

짧은 대답 : 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사용할 '가장 좋은 만능'조합 이라고 주장 할 수 있습니다. (해당 언어의 뉘앙스를 원하는 사람들을위한 터키어, 스페인어 등의 데이터 정렬도 있습니다.)


나의 새로운 링크 당신이 얻을 출력에서 UTF8 문제를 디버깅하는 방법.
Rick James

unicode_520_ci가 모든면에서 최고가 아닌 이유 : stackoverflow.com/a/49982378/62202
Louis

@Louis-내가 암시했듯이 스페인어와 터키어 (폴란드어 포함) 사용자는 만족하지 않을 수 있습니다. "최고의 만능"은 모든 사람에게 상처를주는 경향이 있습니다. MySQL 8.0은 utf8mb4_0900_ai_ci 보다 새로운 "최상의"데이터 정렬을 제공 합니다. 아아, 다시 L = Ł.
Rick James

4

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;

1
이것은 올바르지 않습니다. MySQL이 호출 utf8하는 것은 "전체"UTF-8이 아닙니다.
TWR Cole


2

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 가 다소 중요하다고 언급합니다 .


이 사랑받지 못하는 무 표결 답변이 저를 도왔습니다! 그래서 그것은 내 투표를 얻습니다. skip-character-set-client-handshake열쇠였습니다.
Marcus


0

당신을 설정 database collation하기 위해 UTF-8 다음 적용을 table collation데이터베이스 기본값.


-1

귀하의 대답은 MySql 설정으로 구성 할 수 있다는 것입니다. 내 답변에는 문맥에서 벗어난 것이있을 수 있지만 이것은 또한 당신을위한 도움이라는 것을 알고 있습니다.
구성 방법 Character SetCollation .

기본 MySQL 문자 세트 및 데이터 정렬 ( latin1, latin1_swedish_ci)을 사용하여 데이터를 저장하는 애플리케이션의 경우 특별한 구성이 필요하지 않습니다. 응용 프로그램에 다른 문자 집합 또는 데이터 정렬을 사용하는 데이터 저장소가 필요한 경우 여러 가지 방법으로 문자 집합 정보를 구성 할 수 있습니다.

  • 데이터베이스 당 문자 설정을 지정합니다. 예를 들어 한 데이터베이스 utf8를 사용하는 응용 프로그램에는 sji가 필요할 수 있지만 다른 데이터베이스를 사용하는 응용 프로그램에는 sji가 필요할 수 있습니다.
  • 서버 시작시 문자 설정을 지정합니다. 이로 인해 서버는 다른 준비를하지 않는 모든 응용 프로그램에 대해 지정된 설정을 사용합니다.
  • 소스에서 MySQL을 빌드하는 경우 구성시 문자 설정을 지정합니다 . 이렇게하면 서버 시작시 지정하지 않고도 서버가 모든 응용 프로그램에 대해 지정된 설정을 사용합니다.

여기에 표시된 예제는 utf8 문자 집합을 설정하는 질문에 대해 여기에서 더 유용한 데이터 정렬을 설정합니다 ( utf8_general_cicollation`).

데이터베이스 별 문자 설정 지정

  CREATE DATABASE new_db
  DEFAULT CHARACTER SET utf8
  DEFAULT COLLATE utf8_general_ci;

서버 시작시 문자 설정 지정

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

MySQL 구성시 문자 설정 지정

shell> cmake . -DDEFAULT_CHARSET=utf8 \
           -DDEFAULT_COLLATION=utf8_general_ci

연결에 적용되는 문자 세트 및 데이터 정렬 시스템 변수의 값을 보려면 다음 명령문을 사용하십시오.

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

이것은 긴 대답 일 수 있지만 모든 방법이 있으며 사용할 수 있습니다. 내 대답이 도움이 되었기를 바랍니다. 자세한 내용은 http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html


-2

SET NAMES UTF8

이것은 트릭입니다


2
SET NAMES UTF8(또는 UTF8mb4)을 사용하는 것이 맞지만 그것이 무엇을하는지 설명하지 않습니다 (이 연결에 사용 된 문자 집합). "이것은 트릭을 수행합니다"가 문제를 해결하는 것처럼 들리지만 (MySQL이 UTF-8을 적절하게 처리하도록 함) 많은 MySQL 데이터베이스가 기본적으로 latin1로 설정되어 있으므로 적절한 솔루션이 아닙니다. 나는 것이 기본 문자 집합 변경 및 utf8mb4에 테이블 문자 집합을. 정말,이 답변은 다소 불완전하기 때문에 나는 그것을 거절했습니다.
basic6

-2

UTF-8에 대한 데이터베이스 연결

$connect = mysql_connect('$localhost','$username','$password') or die(mysql_error());
mysql_set_charset('utf8',$connect);
mysql_select_db('$database_name','$connect') or die(mysql_error());

-3

데이터베이스 연결을 UTF8로 설정하십시오.

  if($handle = @mysql_connect(DB_HOST, DB_USER, DB_PASS)){          
         //set to utf8 encoding
         mysql_set_charset('utf8',$handle);
  }

PHP를 실행하는 경우 더 이상 사용되지 않는 mysql_*인터페이스를 사용하지 마십시오 . mysqli_*또는로 전환하십시오 PDO.
Rick James

-3

해결책을 찾을 수있었습니다. http://technoguider.com/2015/05/utf8-set-up-in-mysql/에 지정된대로 다음을 실행했습니다.

SET NAMES UTF8;
set collation_server = utf8_general_ci;
set default-character-set = utf8;
set init_connect = SET NAMES utf8′;
set character_set_server = utf8;
set character_set_client = utf8;

첫 번째는 이미 그 포함하기 때문에 마지막 두 줄은 중복 : dev.mysql.com/doc/refman/5.0/en/charset-connection.html
DanielM

또한 완전한 솔루션이 아닙니다. 열에는 CHARACTER SET utf8. root모든 중요한 init_connect.
Rick James
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.