2016-09-16 13 views
0

最近、latin1からutf-8にMySQLデータベースを変換しました。すべてがBLOB列から離れています。ある例では、このフィールドには、「ダイヤモンドの疑問符」として表示される誤った文字が含まれています。MySQLのBLOBフィールドの文字セットをUTF-8に変換する

このデータをブロブから取得する場合は、PHPのutf8_encode()を使用して実行してください。正常に表示されます。さらに、utf8_encode()のデータをblobフィールドに保存すると、データを表示するためにデータをuf8_encode()する必要がなくなりました。

PHPの介入を必要とせずにBLOBデータを変換するにはどうすればよいですか?

UPDATE 1(2016年9月19日):

Iテキストフィールドに亘っBLOBをコピーしようとしたが、エラーがまだ存在します。

はここにある、支援するために、BLOBからのサンプルデータ:

HEX:

613A313A7B733A373A22636F6E74656E74223B733A3333333A223C70207374796C653D22746578742D616C69676E3A2063656E7465723B223E0A093C7370616E207374796C653D22636F6C6F723A20726762283235352C203235352C20323535293B223E3C7370616E207374796C653D22666F6E742D73697A653A20323470783B223E4672696C616E736F707064726167202D2042696C646561726B69763C2F7370616E3E3C2F7370616E3E3C2F703E0A3C70207374796C653D22746578742D616C69676E3A2063656E7465723B223E0A093C62723E0A093C7370616E207374796C653D22666F6E742D73697A653A20323070783B223E3C7370616E207374796C653D22636F6 C6F723A20726762283231312C203231312C20323131293B223E496E666F726D61736A6F6E202D20446F6B756D656E7461736A6F6E202D20507265737365202D20466F727374F87272656C7365723C2F7370616E3E3C2F7370616E3E3C2F703E0A223B7D

期待値: - Bildearkiv

Frilansoppdrag:この例では

a:1:{s:7:"content";s:333:"<p style="text-align: center;"> 
    <span style="color: rgb(255, 255, 255);"><span style="font-size: 24px;">Frilansoppdrag - Bildearkiv</span></span></p> 
<p style="text-align: center;"> 
    <br> 
    <span style="font-size: 20px;"><span style="color: rgb(211, 211, 211);">Informasjon - Dokumentasjon - Presse - Forstørrelser</span></span></p> 
";} 

、私が表示され、次のテキストで終わります情報 - ドキュメント - プレス - 推薦者

いくつかのPHP関数を使用して、データがUTF8であると言われています。私が表示しているページもUTF8です。だから私はなぜ特別な文字のエラーを取得しているのか少し混乱している。さらに、ページのエンコーディングをUTF-8からISO-8859-15に変更すると、文字が正しく表示されます。

ありがとうございました!

+0

アンオフトピック側の質問:理由は何ですかテキストをblobフィールドに保存します(http://stackoverflow.com/questions/7071662/mysql-text-vs-blob-vs-clobを参照)。 – reporter

+1

BLOBの全体点は、それに関連付けられた文字セットがないことです。@reporterに同意します。** BLOBを使用する際のポイントは** charsetが必要です。ブロブをテキストに変換し、問題を解決します。それはあなたが正しくそれを行う方法です。 – Mjh

+0

@Mjh私はちょうど、緊急のデータ型のテキストへの切り替えを行い、データの半分が切り捨てられました。したがって、それを明らかにブロブからテキストに切り替えるだけです。 – David

答えて

0

BLOBのエンコーディングを理解することなく、BLOBをTEXTに変換することはできません。また、BLOBの 'text'がさまざまな方法でエンコードされている場合、テキストの一部を失うことなくTEXTに変換することはできません。

ブロブのHEX()を見てください。たとえば、éがあり、HEXがE9となった場合、テキストは、おそらくはlatin1としてエンコードされています。代わりにC3A9を取得した場合は、おそらくutf8(またはutf8mb4)を使用している可能性があります。この分析を最初に行うことなく、BLOB内の "テキスト"を破壊する(切り捨てまたは疑問符に変わる)可能性があります。それはデータを失うでしょう!

のようなALTERルックス:

ALTER TABLE t MODIFY c TEXT CHARACTER SET latin1 NOT NULL; -- if E9 
ALTER TABLE t MODIFY c TEXT CHARACTER SET utf8mb4 NOT NULL; -- if C3A9 

注意:

  • がバックアップを持っているようにしてください。何かがうまくいかない場合。データが失われる可能性があります。
  • tcをテーブル名とカラム名に変更します。
  • 現在の宣言と一致するようにNULLまたはNOT NULLを追加します。
  • 宣言に他のものを転送します。 (。あなたはテキストされるべきだと思うものを含める)
  • 私E9/C3A9の例では、十分に明確でない場合は、のは、さらなる議論のためのいくつかのHEXを見てみましょう
+0

'F9'は'ø'のlatin1(またはlatin5またはdec8)のhexです。私はあなたが最後の言葉がForstørrelserであることを期待していると思いますか?だから、おそらく私の最初の 'ALTER'は、あなたが必要とするものです。 –

関連する問題