MySQL 가져오기 인코딩 문제 - 다시 확인
표준 MySQL Import Encoding 문제가 있는데 해결할 수 없을 것 같습니다.
내 고객은 한동안 WordPress 설치를 실행하고 있습니다.데이터베이스를 파일에 버려서 로컬로 가져왔어요.그 결과 페이지 전체에 「」자가 흩어져 있습니다.
양쪽 데이터베이스 속성을 검사했습니다.production : show create database wordpress ;
CREATE DATABASE `wordpress` /*!40100 DEFAULT CHARACTER SET latin1 */
local: show create database wordpress;
CREATE DATABASE `wordpress` /*!40100 DEFAULT CHARACTER SET latin1 */
프로덕션: show create table wp_preating;
CREATE TABLE `wp_posts` (
`ID` bigint(20) unsigned NOT NULL auto_increment,
...
KEY `post_date_gmt` (`post_date_gmt`)
) ENGINE=MyISAM AUTO_INCREMENT=7932 DEFAULT CHARSET=utf8
local: show create table wp_module;
CREATE TABLE `wp_posts` (
`ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
...
KEY `post_date_gmt` (`post_date_gmt`)
) ENGINE=MyISAM AUTO_INCREMENT=7918 DEFAULT CHARSET=utf8
몇 시간 동안 포럼을 읽었는데 어떻게 하면 ,를 뭉개버릴 수 있는지 알 수가 없어요.답변의 99%는 데이터베이스 간의 문자 집합과 일치한다고 말합니다.다음과 같은 경우에 효과가 있을 것으로 생각됩니다.
mysqldump --opt --compress --default-character-set=latin1 -uusername -ppassword wordpress | ssh username@anotherserver.net mysql --default-character-set=latin1 -uusername -ppassword wordpress
저도 utf8 char-set을 사용해서 해봤어요.아직 ㅇ's에 있어요.
SQL 덤프를 직접 수정하여 "SET names UTF8" 행에 utf8 또는 latin1을 넣었습니다.아직 ㅇ's에 있어요.
이상한 증상
charact나 ,와 같은 특수 문자 대신 이 charact자가 등장할 것으로 예상되지만, 보통 공백이 있는 곳에서 본 적이 있습니다.나는 또한 아포스트로피(모든 아포스트로피는 아니지만), 큰따옴표, 상표 기호 대신 그것을 보았다.
marks 마크는 꽤 희귀합니다.페이지당 평균 3~4회 표시됩니다.
Sequel Pro(로컬 또는 라이브)에서 데이터베이스를 볼 때 '가 보이지 않습니다.Textmate에서 볼 때 SQL에 '이 표시되지 않습니다.
제가 무엇을 빠뜨리고 있나요?
편집
상세 정보:
라이브 데이터베이스가 인코딩을 어떻게 생각하는지 알아내려고 노력했습니다.나는 달렸다show table status
, 그리고 콜레이션은 혼합된 것으로 보입니다.utf8_general_ci,
utf8_binand
latin1_syslog_ci' 입니다.뭐가 다른 거죠?그게 중요한가요?
저도 뛰었습니다.show variables like "character_set_database"
그리고 받았다latin1
;
저는 이렇게 해서 문제를 해결했습니다.
첫번째mysqldump -uusername -ppassword --default-character-set=latin1 database -r dump.sql
다음으로 다음 스크립트를 실행합니다.
$search = array('/latin1/');
$replace = array('utf8');
foreach (range(128, 255) as $dec) {
$search[] = "/\x".dechex($dec)."/";
$replace[] = "&#$dec;";
}
$input = fopen('dump.sql', 'r');
$output = fopen('result.sql', 'w');
while (!feof($input)) {
$line = fgets($input);
$line = preg_replace($search, $replace, $line);
fwrite($output, $line);
}
fclose($input);
fclose($output);
이 스크립트는 127 이상의 모든 16진수 문자를 검색하여 HTML 엔티티에 인코딩합니다.
그리고나서mysql -uusername -ppassword database < result.sql
이전 WordPress 데이터베이스와 최신 WordPress 데이터베이스의 공통적인 문제는 데이터베이스 테이블이 latin-1로 설정되지만 실제로는 UTF-8로 인코딩된다는 것입니다. UTF-8로 내보내려고 하면 MySQL은 Latin-1 데이터를 UTF-8로 변환하려고 시도합니다. 데이터가 이미 UTF-8로 인코딩되었기 때문입니다.
해결책은 테이블을 latin-1로 내보내는 것입니다.MySQL은 이미 latin-1이라고 생각하기 때문에 직접 내보내기를 합니다.
문자 집합을 'latin1'에서 'utf8'로 변경합니다.덤프된 데이터는 내보내기 프로세스 중에 변환되지 않았기 때문에 실제로는 UTF-8 인코딩된 데이터입니다.
UTF-8로 새 테이블을 만듭니다.CREATE TABLE 명령어가 SQL 덤프 파일에 있는 경우 문자 집합을 'latin1'에서 'utf8'로 변경합니다.
데이터를 정상적으로 Import 합니다.덤프 파일에 UTF-8 인코딩 데이터가 있고 덤프 파일에 선언된 문자 세트가 UTF-8이며 Import할 테이블이 UTF-8이므로 모든 작업이 원활하게 진행됩니다.
wp-config를 수정하여 이 문제를 해결할 수 있었습니다.php는 다음과 같습니다.
/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');
/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', 'utf8_general_ci' );
이 문제는 다음과 같이 해결할 수 있습니다.
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$db = mysql_select_db('mysql_db', $link);
mysql_query('set names utf8', $link);
언급URL : https://stackoverflow.com/questions/5984697/the-dreaded-mysql-import-encoding-issue-revisited
'programing' 카테고리의 다른 글
지시문에서 마우스 오버 시 클래스 변경 (0) | 2023.03.02 |
---|---|
Oracle의 모든 테이블 목록을 가져오시겠습니까? (0) | 2023.03.02 |
JSON Schema: number-or-null 값을 확인합니다. (0) | 2023.03.02 |
SyntaxError: 식이 필요한데 '<'이(가) 수신되었습니다. (0) | 2023.03.02 |
NextJs와 CreateReact App의 차이점은 무엇입니까? (0) | 2023.03.02 |