나는 데비안 설치를 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
.
이 문제는 다음으로 해결할 수 있습니다.
- 데이터베이스를 Latin1 파일로 덤프하고 파일을 UTF-8로 가져옵니다. MySQL 문자 인코딩 불일치 수정;또는
MySQL에서는 다음
binary
을 변환하여 잘못된 인코딩을 무시합니다.UPDATE table SET column=CONVERT(CONVERT(column USING binary) USING utf8) WHERE id=123;
답변2
@CL의 답변입니다. 디버깅 측면에서 많은 도움이 되었지만 그 반대가 사실입니다. 데이터베이스와 백업 파일은 모두 latin1로 인코딩되어 있지만 클라이언트는 UTF-8 출력을 기대합니다.
해결책은 character_set_client
latin1로도 설정되어 있는지 확인하는 것입니다.
[client]
default-character-set = latin1