8

LOAD DATA INFILE を使用して一部のデータを MySQL データベースにインポートしました。テーブル自体とカラムはUTF8文字セットを使用していますが、データベースのデフォルトの文字セットはlatin 1です。データベースのデフォルトの文字タイプはlatin1で、文字セットを指定せずにLOAD DATA INFILEを使用したため、解釈されましたファイル内のデータは UTF8 でしたが、ファイルは latin1 として表示されます。現在、UTF8 列に不適切にエンコードされたデータがたくさんあります。この記事を見つけました「cp1251に挿入されたUTF8」という同様の問題に対処しているようですが、私の問題は「UTF8に挿入されたLatin1」です。そこでクエリを編集して、latin1 データを UTF8 に変換しようとしましたが、うまくいきません。データは同じように出力されるか、以前よりもさらに複雑になります。例として、Québec という単語は Québec として表示されます。

[追加情報]

HEX() でラップされたデータを選択すると、Québec の値は 5175C383C2A9626563 になります。

このテーブルの Create Table (短縮) は、.

CREATE TABLE MyDBName.`MyTableName`
(
`ID` INT NOT NULL AUTO_INCREMENT, 
.......
`City` CHAR(32) NULL, 
.......
`)) ENGINE InnoDB CHARACTER SET utf8;
4

7 に答える 7

11

古いワードプレスのインストールでこのようなケースがありましたが、データ自体がLatin1データベース内ですでにUTF-8になっているという問題がありました(WPのデフォルトの文字セットによる)。これは、データの変換が実際には必要ではなく、ddbb およびテーブル形式が必要であることを意味します。私の経験では、MySQL がクライアントのデフォルトの文字セットを使用することを理解しているため、ダンプを実行すると混乱します。多くの場合、現在は UTF-8 です。したがって、データの同じコーディングでエクスポートすることが非常に重要です。UTF-8 コーディングの Latin1 DDBB の場合:

$ mysqldump –default-character-set=latin1 –databases wordpress > m.sql

次に、UTF-8 で新しいデータベースに再インポートする前に、エクスポートされたダンプ内の Latin1 参照を置き換えます。並べ替え:

$ replace "CHARSET=latin1" "CHARSET=utf8" \
    "SET NAMES latin1" "SET NAMES utf8" < m.sql > m2.sql

私の場合、このリンクは非常に役立ちました。ここにスペイン語でコメントしました。

于 2009-12-21T12:42:44.937 に答える
7

OPにとってはまだほとんど現実的ではありませんが、たまたまALTER TABLEのMySQLドキュメントで解決策を見つけました。今後の参考のためにここに投稿します。

警告

CONVERT TO 操作は、文字セット間で列の値を変換します。これは、1 つの文字セット (latin1 など) の列があり、格納された値が実際には別の互換性のない文字セット (utf8 など) を使用している場合には望ましくありません。この場合、そのような列ごとに次の操作を行う必要があります。

ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;

これが機能する理由は、BLOB 列との間で変換するときに変換がないためです。

于 2012-01-17T16:52:43.980 に答える
2

LOAD DATA INFILE を使用すると、次の場所にあるはずのエンコーディング ファイルを設定できます。

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

于 2009-09-17T19:46:47.850 に答える
2

私はhttp://code.google.com/p/mysqlutf8convertor/をラテンデータベースから UTF-8 データベースに書きました。すべてのテーブルとフィールドを UTF-8 に変更します。

于 2009-12-27T04:16:36.287 に答える
1

latin1 を UTF8 に変換することは、あなたがやりたいことではありません。逆のことが必要です。

もし本当に起こったことがこれだったら:

  1. UTF-8 文字列は、Latin-1 として解釈され、UTF-8 にトランスコードされ、文字列が破損していました。
  2. あなたは今、UTF-8 文字列をそれ以上解釈せずに読んでいる、または読んでいる可能性があります

あなたが今しなければならないことは次のとおりです。

  1. トランスコードなしで「UTF-8」を読み取ります。
  2. Latin-1 に変換します。これで、元の UTF-8 が実際にあるはずです。
  3. これ以上変換せずに「UTF-8」列に入れます。
于 2009-09-17T19:35:42.543 に答える
1

最近、変換プロセスを自動化するシェル スクリプトを完成させました。置換または削除したいテキストのカスタム フィルターを作成するように構成することもできます。例: HTML 文字の削除など。テーブルのホワイトリストとブラックリストも可能です。sourceforge でダウンロードできます: https://sourceforge.net/projects/mysqltr/

于 2013-03-20T21:36:10.257 に答える
0

これを試して:

1)DBをダンプします

mysqldump --default-character-set=latin1 -u username -p databasename < dump.sql

2)テキストエディタでdump.sqlを開き、「SETNAMESlatin1」の出現箇所をすべて「SETNAMESutf8」に置き換えます。

3)新しいデータベースを作成し、ダンプファイルを復元します

cat dump.sql | mysql -u root -p newdbname
于 2012-05-16T15:36:10.783 に答える