programing

MySQL 가져오기 인코딩 문제 - 다시 확인

lastmemo 2023. 3. 2. 21:56
반응형

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_binandlatin1_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

반응형