私は、データベースをLatin1からUTF-8に変換するという退屈で面倒な作業を引き受けようとしています。
この時点で、テーブルに格納したデータの種類を確認するだけです。これにより、データの変換に使用する方法が決まります。
具体的には、Latin1列にUTF-8文字があるかどうかを確認したいのですが、これを行うための最良の方法は何ですか?数行のみが影響を受ける場合は、手動で修正できます。
オプション1. MySQLダンプを実行し、Perlを使用してUTF-8文字を検索しますか?
オプション2. MySQL CHAR_LENGTHを使用してマルチバイト文字を含む行を検索しますか?例えばSELECT name FROM clients WHERE LENGTH(name) != CHAR_LENGTH(name);
これで十分ですか?
現在、MysqlクライアントのエンコーディングをUTF-8に切り替えています。
タイムゾーンと同様に、文字エンコーディングは常に問題の原因です。
「high-ASCII」文字はLATIN1アクセント付き文字または記号、またはUTF-8マルチバイト文字の最初のいずれかであるため、実行できることは何ですか。あなたが少しカンニングしない限り、違いを伝えるのは簡単ではありません。
どのエンコーディングが正しいかを理解するには、2つの異なるバージョンをSELECT
して視覚的に比較するだけです。次に例を示します。
_SELECT CONVERT(CONVERT(name USING BINARY) USING latin1) AS latin1,
CONVERT(CONVERT(name USING BINARY) USING utf8) AS utf8
FROM users
WHERE CONVERT(name USING BINARY) RLIKE CONCAT('[', UNHEX('80'), '-', UNHEX('FF'), ']')
_
MySQL正規表現エンジンは_\x80
_のようなものを無視するようであり、代わりにUNHEX()
メソッドを使用する必要があるため、これは非常に複雑になります。
これにより、次のような結果が生成されます。
_latin1 utf8
----------------------------------------
Björn Björn
_
あなたの質問は完全に明確ではないので、いくつかのシナリオを想定してみましょう:
?
に置き換える必要があります。この種のものに役立つ githubのスクリプト があります。
データベースのダンプを作成し、すべての有効なUTF8シーケンスのgrepを作成します。どこからそれを取得するかは、取得する内容によって異なります。 SOには無効なUTF8の識別について複数の質問があります。基本的には、ロジックを逆にするだけです。
編集:基本的に、完全に7ビットで構成されるフィールドASCIIは安全であり、無効なUTF-8シーケンスを含むフィールドはすべてラテン語であると見なすことができます1.残りのデータを検査する必要があります-運が良ければ、少数の明らかな置換によって絶対的な過半数が修正されます(öをLatin-1öに置き換えるなど)。