10

標準の MySQL インポート エンコーディングの問題がありますが、解決できないようです。

私のクライアントは、WordPress のインストールをしばらく実行していました。データベースをファイルにダンプし、ローカルにインポートしました。結果のページには、全体に � 文字が飛び散っています。

私は両側でデータベースのプロパティを調べました: production: show create database wordpress;

CREATE DATABASE `wordpress` /*!40100 DEFAULT CHARACTER SET latin1 */

ローカル: データベース ワードプレスの作成を表示します。

CREATE DATABASE `wordpress` /*!40100 DEFAULT CHARACTER SET latin1 */

プロダクション: show create table wp_posts;

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_posts;

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 も使用して実行しました。まだ � です。

「SET names UTF8」行にutf8またはlatin1を入れて、SQL ダンプを直接変更しようとしました。まだ � です。

奇妙な症状

これらの � 文字は、コンテンツ内のñöなどの特殊文字の代わりに表示されることを期待していますが、通常はスペースだけが存在する場所を見てきました。また、アポストロフィ (ただし、すべてのアポストロフィではありません)、二重引用符、および商標記号の代わりにそれを見てきました。

�マークはかなり珍しいです。1 ページあたり平均 3 ~ 4 回表示されます。

Sequel Pro (ローカルまたはライブ) を使用してデータベースを表示しても、� は表示されません。Textmate で表示すると、SQL に � が表示されません。

私は何が欠けていますか?

編集

より詳しい情報:

ライブデータベースがエンコーディングをどのように認識しているかを判断しようとしました。を実行しましshow table statusたが、照合順序はutf8_general_ci,utf8_bin andlatin1_swedish_ci` が混在しているようです。彼らは何が違うのですか?それは問題ですか?

私も走った:show variables like "character_set_database"そして得たlatin1;

4

4 に答える 4

11

これが私の問題を解決する方法です:

初め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

于 2012-01-05T22:28:48.020 に答える
6

古い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として作成します。CREATETABLEコマンドがSQLダンプファイルにある場合は、文字セットを「latin1」から「utf8」に変更します。

通常どおりデータをインポートします。ダンプファイルにUTF-8でエンコードされたデータがあるため、ダンプファイルで宣言された文字セットはUTF-8になり、インポートするテーブルはUTF-8になり、すべてがスムーズに進みます。

于 2011-05-12T21:36:39.340 に答える
4

次のように 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' );
于 2014-06-30T05:43:51.997 に答える
0

この方法でこの問題を修正できると思います。

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
$db = mysql_select_db('mysql_db', $link);
mysql_query('set names utf8', $link);
于 2011-05-12T21:35:15.007 に答える