MySQL 5.1~5.5: 모든 UTF-8 문자가 손실되었습니다!

MySQL 5.1~5.5: 모든 UTF-8 문자가 손실되었습니다!

나는 데비안 설치를 MySQL 5.5를 사용하도록 업그레이드하기로 결정했고 며칠 후에 mysql터미널에 UTF-8 문자 대신 가비지가 인쇄되는 것을 발견했습니다.

생성된 SQL 파일을 살펴 mysqldump보니 이미 가비지가 포함되어 있는 것을 확인했습니다. 오늘 저는 데이터베이스를 삭제하고 정상적으로 실행되는 이전 데이터베이스의 복사본을 얻었는데 /var/lib/mysql/database_name/*놀랍게도 여전히 동일한 결과를 얻었습니다.

생성된 파일에는 mysqldump다음 줄이 포함되어 있습니다.

/*!40101 SET NAMES utf8 */;
/*!40101 SET character_set_client = utf8 */;
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

/var/lib/mysql/database_name/db.opt이전 데이터베이스와 새 데이터베이스의 데이터는 동일합니다.

default-character-set=latin1
default-collation=latin1_swedish_ci

내가 지금 무엇을 할 수 있을까? 전체 데이터베이스를 잃지 않기를 바랍니다!

고쳐 쓰다

show session variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

SELECT charset(name), hex(name), name FROM table WHERE id='123';
+---------------+----------------------------------------------+----------------------------+
| charset(name) | hex(name)                                    | name                       |
+---------------+----------------------------------------------+----------------------------+
| latin1        | 457361C3BA204A6F73C3A92064652053616E74616E61 | Esaú José de Santana     |
+---------------+----------------------------------------------+----------------------------+

마지막 명령의 이름 출력은 다음과 같아야 합니다.Esaú José de Santana

답변1

MySQL 출력과 터미널은 잘 작동합니다. 문제는 데이터베이스의 텍스트가 태그로 지정되어 있지만 latin1실제로는 로 인코딩된다는 것입니다 utf8.

이 문제는 다음으로 해결할 수 있습니다.

  1. 데이터베이스를 Latin1 파일로 덤프하고 파일을 UTF-8로 가져옵니다. MySQL 문자 인코딩 불일치 수정;또는
  2. MySQL에서는 다음 binary을 변환하여 잘못된 인코딩을 무시합니다.

    UPDATE table SET column=CONVERT(CONVERT(column USING binary) USING utf8) WHERE id=123;
    

    MySQL의 열 인코딩 혼란 수정.

답변2

@CL의 답변입니다. 디버깅 측면에서 많은 도움이 되었지만 그 반대가 사실입니다. 데이터베이스와 백업 파일은 모두 latin1로 인코딩되어 있지만 클라이언트는 UTF-8 출력을 기대합니다.

해결책은 character_set_clientlatin1로도 설정되어 있는지 확인하는 것입니다.

[client]
default-character-set = latin1

관련 정보