2012-02-13 12 views
1

私のデータベースはまたは'��"'(私の端末がそれぞれlatin1またはunicodeに設定されているかどうかによって異なります)でいっぱいです。文脈から、私はそれらがemdashesであるべきだと思います。 IEでレンダリングされた(またはレンダリングされなかった)とき、彼らは厄介なバグを引き起こしているようです。私はそれらを見つけて交換したいと思います。問題は、âも もreplaceと一致しないことです。クエリの実行:mysql内のガベージ文字を置き換えてください

エラーなしで実行しますが、何もしません(0行が変更されました)。私が端末にコピーしたとき、「ダイヤモンドの疑問符」の文字が一致していないことは明らかです。そのコードを見つけてそれを何かにマッチさせる方法はありますか? mysqlコンソールは、これを1行で行うことができるほど近くにあります。だから私はそれを避けることができれば、端末の外でそれをスクリプト化したくないでしょう。

dbはホストされているAmazon RDSなので、ここで他の質問で参照したregexp udfをインストールすることはできません。長期的には、データベース全体をutf8に適切に変換する必要がありますが、このレンダリングの問題を直ちに解決する必要があります。

EDIT:

私はhexdumpと悪い文字を分離しましたが、それはE2 80(私はこれは任意のUnicode文字に対応しないと思います)です。それをどのようにして置換関数に与えることができますか?

update TABLE set COLUMN = replace(COLUMN, char(0xe2,0x80),'---'); 

は何もしません。

+0

latin1になる理由はありますか?私は現在、デフォルトでUnicodeを使用する傾向があります。変換するのは難しいことではありません.DBをSQLにダンプし、utf8を使用する新しいデータベースにリロードしてください。 –

+0

私はそれを継承しました。ダンプは、私が避けたいと思うかなりのダウンタイムを伴うため、望ましくありません。私はhttp://nicj.net/2011/04/17/mysql-converting-an-incorrect-latin1-column-to-utf8のようなインプレース・メソッドを読んできましたが、それを適応させる時間はありませんでした私のdbに。 – mmdanziger

+0

これ以外の選択肢はないかもしれませんが、この問題のある文字シーケンスを持つ行をすべて探し、それぞれの文を手作業で修正してください(ただしスクリプトはこれを行うのに役立ちます)。 – staticsan

答えて

1

私はそれを理解しました。 mysqlの組み込みのhex関数を使用して、わかっていた項目をダンプしました。その後

select hex(column) from table where id=666; 

は、言葉(「20」秒の間に挟まれたこれらの数字)を選んだとバイトの私の問題のセットが実際x'C3A2E282AC2671756F743B'であることを発見しました。これがPHPと私のシステムでコード化されているのを見た方法(e2 80と同じ)私は分かりませんが、現時点では気にしません。

確認するには、データを破壊する前に、あなたは、MySQLへのそれをバックプラグ:だから

select x'C3A2E282AC2671756F743B'; 
    +---------------------------+ 
    | x'C3A2E282AC2671756F743B' | 
    +---------------------------+ 
    | â€"    | 
    +---------------------------+ 
    1 row in set (0.00 sec) 

を、上記のようなクエリを置き換える使用して、私は一度にすべての悪いデータを取り除くことができました。それがあったレコードの

update TABLE set COLUMN = replace(COLUMN, x'C3A2E282AC2671756F743B','--'); 

私は本当にこれが誰かのために有用であると思います。 snafusをエンコーディングするのはmysqlでよく見かけるが、私はどこでもを探して、この最終的にはかなり単純なプロセスの説明を見つけることができなかった。

+0

'x'C3A2''は'â'のUTF-8です。 'x'E282AC 'は'€ 'のUTF-8です。 'x'2671756F743B''は' " 'のASCIIなので、何かがUnicodeのエンコーディングをしています... – Neil

+0

@Neil私は、テキストがいくつかのMS cp1252(または別のMSスキーム)で準備されていて、非効率的に変換されたUTF8に変換し、latin1カラムにダンプします。 cp1252のen/emダッシュはUTF8にうまくコピーされないので、それを任意のジャンクであるように見えるものに変換していました...しかしen(em)ダッシュはcp1252とE2 80 93(E2 80)では96(97) 948)UTF8で...どちらかがc3a2e82acになったかどうかわかりません... – mmdanziger

+0

E2 80 94はWindows-1252で ' - 'おそらくスマートな見積もりが、 '"'になっています。 – Neil

0

latin-1と解釈しようとしているemダッシュ(U + 2014)がUTF-8エンコード(E2 80 94)で送信されている可能性がありますが、latin-1では無効です範囲は80-9Fなので、違法バイトの代わりにUnicodeの置換文字が表示される可能性があります。したがって、表示するとâ��となります。 Windows-1252で比較すると、—と表示されます。

CHAR(0xE2, 0x80, 0x94)を使用して検索文字列を作成することができます。

+0

あなたの答えは正しい方向に私を導いた、私は悪いキャラクターが「e2 80」だと分かった。しかし、私はどのように置換クエリを形成するのですか?それは私がそれがどれほど期待されるかではありません。 – mmdanziger

+0

実際には...それはe2ではありません80.以下の問題の私の解決策を見てください。 – mmdanziger