2016-10-18 20 views
0

これは何度もよく聞かれている質問です。しかし、私はまだGoogleから正解を得ることができません。MySqlデータをLatin1からUTF8に変換する

私のWebアプリケーションには、データを収集するためのフォームがあり、アプリケーションとすべてのデータはUTF-8で収集されています。しかし、誤って、スキーマとテーブルのコレクションはlatin1として設定されています。さらに、接続中には、「SET NAMES UTF8」が使用されています。

中国語のデータの一部は、私がどのような変換方法を使用していても、常にクエストマーク(?)として表示されます。クエリの問題の列をバイナリとして表示すると、データが3fの数バイトであることが示されます。これは、いくつかの '?'を意味します。

私のデータがまだutf-8に変換でき、正しく失われているか、既に失われている場合は?

私はUTF-8に全体のデータベースとテーブルを変換するだけでなく、データベースにそれをmysqldumpをし、再インポートしないで行っているので、[UPDATE]

これはHow to convert an entire MySQL database characterset and collation to UTF-8?と同じ質問ではありません。しかし、それらのどれも動作しません。

は[UPDATE 2]

問題は、テーブルの文字セットの変換についてだけではなく、また、UTF-8、ラテン語の符号化方式を理解する必要があります。

基本的な知識がある:

ラテン語の使用のみ1バイト格納するための8ビット。だけでなく、1バイト

MAYを意味

UTF-8を使用動的記憶システムUTF-8符号化方式を識別するための少なくとも1ビットを必要とするので、それが唯一の7ビットはラテン語と比較格納するために使用することができることを意味します。したがって、文字を保存するのに7ビットしか必要ない場合は、UTF-8表現でラテン語に正常に格納できます。ただし、データが7ビットを超えると、破損します。

したがって、このような中国語と日本の場合、UTF-8表現の最初のバイトがすでにラテン語が格納できる範囲を超えているため、格納に2〜3バイト必要です。

これは、データベースとテーブルの両方の文字セットを変更しても、 '?'と表示されます。なぜなら、ラテン文字では範囲外のすべての文字が '?'で3Fで表示されるからです。

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

をそしてもちろん、あなたは、いくつかのテーブルのためにそれを行うことができます。

+0

@ HoussemBdr私はこれを行いましたが、何も変わりませんでした。 – panda

+0

jsonを使用して、どのように変換していますか?それともほかに何か? –

+0

@HoussemBdr UTF8中国語は、\ xE5 \ x80 \ x91に '們'のように3バイトを使用して格納します。 latin1テーブルに格納した後、 '?'になります。ですから、alter tableを使ってテーブルコレクションをlatin1からutf8に変更します。これはまだ '?'に表示されます。 Convert(バイナリを使用した列)を使用すると、 '?'に表示されます。最後の2バイトが保存手順中に削除されたようです。 – panda

答えて

0

ジュストは、データベース全体の文字セットを変更します。

Further more have a look at the documentation here.

EDIT: "?"

そうしないと、データがすでにsotredされている場合実際には、それが損傷しているということです。

+0

私はデータベースとテーブルの両方を変更しましたが、何も変わりません。 – panda

関連する問題