2016-05-23 15 views
0

私はワードプレスのサイトを持っており、照合順序はutf8_unicode_ciに設定されており、リトアニア語の文字は(Ą ą Č č etc.)でした。これらの文字はすべて、次のように符号化されて保存されます。(Ä„ , Ä… , ÄŒ , Ä etc)照合変更後に複数の外字を置換する

私はutf8mb4_unicode_ciに照合順序を変更しました。新しいレコードはすべて保存され、正しく表示されます。ただし、古いレコードはすべて、データベース(Ä„ , Ä… , ÄŒ , Ä etc)に表示されているとおりに表示されます。

現在の照合と一致させるために、複数の表の複数の文字を置き換えるにはどうすればよいですか?

ご迷惑をおかけして申し訳ございません。基本的にサイトがunsopportedサーバー上で稼働していたより多くの情報

EDIT。 phpMyAdminはデータベース・サーバ・セクションでは、私は次のような情報を見ることができます:

Server: Localhost via UNIX socket 
Software: MySQL 
Software version: 5.1.58-1~dotdeb.0-log - (Debian) 
Protocol version: 10 
User: [email protected] 
Server charset: UTF-8 Unicode (utf8) 

ここで(フィールドのほとんどはわかりやすくするために削除された)古いテーブルの作成テーブルです:

CREATE TABLE IF NOT EXISTS `wp_posts` (
    `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `post_content` longtext COLLATE utf8_unicode_ci NOT NULL, 
    `post_title` text COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`ID`), 
    KEY `post_name` (`post_name`(191)), 
    KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`), 
    KEY `post_parent` (`post_parent`), 
    KEY `post_author` (`post_author`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ; 

はこちらデシベルの輸出に生成さINSERTの例:

INSERT INTO `wp_posts` (`ID`, `post_content`, `post_title`) VALUES 
(1, 'Tomas TomĆ„ā€”nas', ''); 

は、だから私は、この新しいサーバーにインポートなどの、データベース全体を輸出していました。更新後、私はすべてのテーブルに対して、次のクエリを実行していた

Server: Localhost via UNIX socket 
Server type: MariaDB 
Server version: 10.0.25-MariaDB - MariaDB Server 
Protocol version: 10 
User: [email protected] 
Server charset: UTF-8 Unicode (utf8) 

:ここでは、データベースサーバの情報がある

ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 

今、すべての新しいレコードがどのなく挿入し、所定の位置に、正しい文字で検索されましたしかし、すべての古いレコードは、Ć„ā€”のような奇妙な文字で検索されます。

私が提供すべき他の重要な情報がある場合は、質問してください。

ありがとうございます。 SHOWと

EDIT SELECT HEX(POST_TITLE)と

CREATE TABLE `wp_posts` ( `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
 `post_author` bigint(20) unsigned NOT NULL DEFAULT '0', 
 `post_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
 `post_date_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
 `post_content` longtext COLLATE utf8_unicode_ci NOT NULL,   
`post_title` text COLLATE utf8_unicode_ci NOT NULL,   
`post_excerpt` text COLLATE utf8_unicode_ci NOT NULL, 
 `post_status` varchar(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'publish', 
 `comment_status` varchar(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'open', 
 `ping_status` varchar(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'open', 
 `post_password` varchar(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', 
 `post_name` varchar(200) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', 
 `to_ping` text COLLATE utf8_unicode_ci NOT NULL, 
 `pinged` text COLLATE utf8_unicode_ci NOT NULL,   
`post_modified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
 `post_modified_gmt` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
 `post_content_filtered` longtext COLLATE utf8_unicode_ci NOT NULL, 
 `post_parent` bigint(20) unsigned NOT NULL DEFAULT '0', 
 `guid` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', 
 `menu_order` int(11) NOT NULL DEFAULT '0', 
 `post_type` varchar(20) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'post', 
 `post_mime_type` varchar(100) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', 
 `comment_count` bigint(20) NOT NULL DEFAULT '0',  PRIMARY KEY (`ID`), 
 KEY `post_name` (`post_name`(191)),   
KEY `type_status_date` (`post_type`,`post_status`,`post_date`,`ID`),   
KEY `post_parent` (`post_parent`),   
KEY `post_author` (`post_author`)) ENGINE=MyISAM AUTO_INCREMENT=6394 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

EDIT

real title is "gegužės 9, 2016 @ 10:16 PM" 
post_title = gegužės 9, 2016 @ 10:16 PM 
HEX(post_title) = 4F7264657220266E646173683B2067656775C385C2BEC384E280947320392C203230313620402031303A313620504D 
+0

NO!テーブルの宣言とデータを修正しましょう。あなたが持っていたものと、この混乱に巻き込まれた措置を加えてください。 –

+0

「古いレコード」と「新しいレコード」には、SELECT col、HEX(col)...を指定してください。それは私たちがそれを解明するのに役立ちます。 –

+0

'SHOW CREATE TABLE'と接続パラメータを提供してください。 –

答えて

1

可能性のある解答表を作成します。

生成INSERTた出力mysqldumpから?また、オプション--default-character-set=utf8は含まれていませんでしたか?

(私は、証拠がなく、問題を引き起こしたと思います。)

いくつかの「正しい」文字といくつかの「Mojibake」(たとえばÄ„)という表がありますか?そして、あなたはMojibakedの行を見つけて修正したいのですか?

WHERE col LIKE '%Ä%'この回答を検索できます。しかし、TomĆ„ā€”nasは同じパターンに従っていないので、十分ではないかと心配しています。

私はどのようにして "â€"を解くのか見ていません - それは2つまたは3つのステップかもしれません。

utf8またはutf8mb4より前の表はCHARACTER SETでしたか?通常、Mojibakeは他の文字セット(latin1など)とutf8の間の間違った変換を伴います。私はlatin2、latin5、latin7を試しました。誰も働かないようでした。

私が要求したSELECTsを入力してください。

私はあきらめていませんが、これはかなり難しい課題です。

可能性を修正しまし

(これは、または完全な正解であってもなくてもよいので、私は "可能" と言う。)

まず、それをテスト:

SELECT ID, 
     CONVERT(BINARY(CONVERT(post_title USING latin1)) USING utf8) 
    FROM wp_posts; 

見にすべての行がpost_titleの場合は正常に動作します。あなたは、出力を、...好きなら

UPDATE wp_posts 
    SET post_title = 
     CONVERT(BINARY(CONVERT(post_title USING latin1)) USING utf8) 

証拠:

mysql> SELECT CONVERT(BINARY(CONVERT('gegužės 9, 2016 @ 10:16 PM' USING latin1)) USING utf8); 
+---------------------------------------------------------------------------------------+ 
| CONVERT(BINARY(CONVERT('gegužės 9, 2016 @ 10:16 PM' USING latin1)) USING utf8)  | 
+---------------------------------------------------------------------------------------+ 
| gegužės 9, 2016 @ 10:16 PM               | 
+---------------------------------------------------------------------------------------+ 
+0

お手数をおかけしていただきありがとうございます。今質問にお答えします。 はい、INSERTはmysqldumpからの出力であり、 '--default-character-set = utf-8'は含まれていませんでした。 古いレコードはすべて「Mojibake」です。彼らは古いデータベースのMojibakesであることを覚えておいてください。しかし、WordPressは、文字セットを変更する前に、フロントエンドで適切なリトアニア文字に変換していました。そのため、管理者は問題を解決することを怠りませんでした。そのため、Mojibakedレコードがたくさんあるのです。 – WpDoe

+0

合計16文字の大文字と小文字があり、それぞれが別の文字として表示されます。 古いデータベースはutf8で、新しいデータベースはutf8mb4です。 あなたが直ちにリクエストして質問に追加する 'SELECTs'を生成します。 もう一度ありがとうございます。 – WpDoe

+0

16文字は何ですか? utf8とutf8mb4はすべての西ヨーロッパ/東ヨーロッパの文字で同じです。 (中国語、絵文字などの違いがあります)つまり、utf8/utf8mb4は問題の一部ではなく、解決策にも関係しません。 –

関連する問題