私たちはEtherpad Liteを実行しており、MySQLからPostgreSQLにデータベースを移行しようとしています。Etherpad LiteデータベースのMySQL utf8mb4カラムの無効なデータをデバッグする方法
MySQLデータベースの 'value'列の形式はutf8mb4です。しかし、実際にはUTF-8の代わりにWindows-1252またはISO-8859-15でエンコードされた値をすべての行の約10%が含んでいます。これはどのように可能ですか? MySQLはUTF-8を列に入力する前に検証しませんか?
PostgreSQLは、データの検証やヒットなどの理由で、移行中に無効な値を受け入れることができません。生のバイト0xE4(ISO-8859-15:ä
)は、UTF-8で0xC3 0xA4のバイトシーケンスとしてエンコードされる必要があります。
これはMySQLの「機能」として知られていますか? utf8mb4
列から実際のUTF-8を取得する方法はありますか?
私は、クライアントが 'set names utf8'と言ってデータベース列が' utf8mb4'型で、 'SELECT'が'ä'またはU + 00E4の代わりに生のバイト '\ xE4'を含む文字列を返すケースがあります。 UTF-8はその文字を '\ xC3 \ xA4'としてエンコードする必要があることに注意してください。データは、問題が発生した場合にnode.jsサービスによって最初に入力されます。 –
その後、utf8であるバイトについて「嘘つき」となりました。 16進数 'E4'はlatin1です。 'U + 00E4'も同様に見えるかもしれませんが、それはlatin1やutf8ではなく_unicode_です。 'set names utf8'と言うと、_client_は'ä'に対して 'C3A4'という16進数を持つことになります。 –
私はUTF-8文字列では普通の '0xE4'は現れないはずだと同意します。しかし、Etherpad Lite(node.jsで動作)は、UTF-8文字列の途中で生のWindows-1252文字を出力することがあります(これはnode.jsやEtherpad Liteのバグだと思います)。 MyISAMテーブルMySQLがこのような無効な文字列を受け入れる代わりに例外をスローした場合、私はこの質問をしません。 –