2016-05-20 29 views
1

私はMySQLにテーブルに人の名前が入っていて、アクセントのある人がいる人もいます。このデータベースが使用した元の文字セット/照合が何であっても、アクセントや文字のある文字は処理できませんでした。 'é'などの文字は 'é'に変わり、このデータベースに接続するフロントエンドアプリケーションで 'ü'などの文字が 'ü'に変わりました。データベースはその後、UTF8のエンコーディングと照合を使用するように変更されました(また、必要なフロントエンドアプリケーションのほとんどが変更されています)。アクセント付きのほとんどの名前が正しくレンダリングされるようになりました。MySQL - 不正な文字を見つけて修正する

問題があり、今リテラル「A©」を持っているいくつかのフィールドがあります(いくつかの奇妙な二重エンコードが手動のものをコピー&ペーストによって引き起こされる?私は知らないが、私はありませんでした!) 。私は今これらのすべてを見つけ、これらのフィールドを修正して、正しいアクセント付き文字を使用する必要があります。

select count(*), bad_char 
from some_table 
inner join (
    select '€' as bad_char union 
    select '‚' as bad_char union 
    select 'Æ’' as bad_char union 
    select '„' as bad_char union 
    select '…' as bad_char union 
    ... 
    -- snip a whole bunch 
    ... 
    select 'þ' as bad_char union 
    select 'ÿ' as bad_char) bad_chars 
where some_table.some_text_field like CONCAT('%',bad_chars.bad_char,'%') 
group by bad_char 
order by count(*); 

そして、私はこのような結果を得る:それらを見つけるために、私は(私がhereを発見したテーブルに基づいて)、クエリを書い

 
count(*), bad_char 
------------------ 
'1',  '¯' 
'1',  'Ñ' 
'1',  'Ö' 
'1',  'Ž' 
'1',  'Ç' 
'1',  '¬' 
...snip... 
'1797', 'ß' 
'4450', 'Ê' 

をしかし、私は、これはかなりの仕事をしない気持ちを持っていますそれが私が思うように。私が探している「bad_char」の組み合わせの一つは、「AS」ですが、私はこのようなクエリを実行すると:

select some_text_field from some_table where some_text_field like '%Ê%'; 

を私は、同じ文字が、アクセントなしである「として」多くの結果を得ます。しかし、 'Â'などの他のケースでは、クエリは正常に動作しているようです。

にこのクエリを取得するにはどうすればいいですか?は 'と'を 'Ã'と同じように扱いますか?

+0

データベースの大きさによっては、コンテンツをダンプするだけで、結果のSQLファイルの文字をテキストエディタで置き換えて、再度アップロードしてください... – CBroe

+0

@CBroe:おそらくあまりにも大きいt。そして、私は実際には、ファイルに抽出して変換し、再読み込みするスクリプトをたくさん作成するのではなく、このようなことをデータベースに保存します。 – FrustratedWithFormsDesigner

+0

phpmyadminとか、もっと小さくしたいのであれば、これはもうちょっとしたスクリプトファイルです。 – CBroe

答えて

1

同じ文字でアクセントのない「as」という結果が多数得られます。使用collationの問題だろう

- これらは、文字比較のためのルールセットであり、それらは異なる言語で同じように処理されるべき文字を定義します。

しかし、BINARYoperatorを使用して、クエリ内で直接変更することができます。 €正しい、されている必要があります - 文字化けについては

0

( 'é' が 'é' になって)、データの修正は、文字化けのような

ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...; 
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...; 

あなたSELECTs音はありますか?

コードの修正は

  • クライアントでは、あなたが持っているバイトが正しくUTF8(良い)でエンコードされていることを理解することです。
  • おそらくデフォルトでSET NAMES latin1(またはset_charset('latin1')または...)と接続しました。 (それはutf8だったはずです)
  • テーブルの列はCHARACTER SET utf8であってもなくてもかまいませんが、それはそうだったはずです。

SET NAMESは多くの場合、言語固有のコードで行われます。どのようなプログラミング言語を使用していますか?

あなたが使用しているものを見るにはSHOW CREATE TABLEを使用してください。それらのいくつかは、適切LATIN1などを持っている場合、latin1のフィールド上の壊れUTF8アクセント付きのテキストを修正しようとしている他の誰のために

0

がUTF8に壊れて、解決策はこれです:

update posts set post_text = @txt where length(post_text) = length(@txt := convert(binary post_text using utf8)); 

これは、との行のみを修正します誤ってエンコードされたUTF8を適切なlatin1エンコーディングに戻します。ááなどになります。

関連する問題