1

たとえば、特別なlatin1文字を書くとき

á, é ã , ê

utf-8 でエンコードされた mysql テーブルに、そのデータは失われますか?

そのテーブルの文字セットは utf-8 です。

latin1 でエンコードされた行を取得して、utf-8 に変換して書き戻す方法はありますか (今回は正しい方法で)。

アップデート

「データ」が何を意味するのか、あまり具体的ではなかったと思います。データとは、行ではなく特殊文字を意味します。

選択すると、行とフィールドが取得されますが、「?」特殊な latin1 文字の代わりに。それらの '?' を復元することは可能です。正しいutf8のものに変換しますか?

4

3 に答える 3

4

データベース全体 (またはテーブル全体) が影響を受ける場合は、最初に、Latin1-as-UTF8 文字セットの問題であることを確認できますSET NAMES Latin1

mysql> select txt from tbl;
+-----------+
| txt       |
+-----------+
| Québec   |
| Québec   |
+-----------+
2 rows in set (0.00 sec)

mysql> SET NAMES Latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> select txt from tbl;
+---------+
| txt     |
+---------+
| Québec  |
| Québec  |
+---------+
2 rows in set (0.00 sec)

これが検証された場合、つまり、デフォルトの文字セット Latin-1 を使用して目的のデータを取得した場合は、テーブル全体を強制的にダンプして、文字セットの仕様が間違っていても--default-character-set=latin1正しいデータでファイルが作成されるようにすることができます。

しかし、今ではヘッダー行を次のように置き換えることができます

/*!40101 SET NAMES latin1 */;

UTF8で。データベースを再インポートすれば完了です。

一部の行のみが影響を受ける場合は、さらに困難になります。

SELECT txt, CAST(CAST(txt AS CHAR CHARACTER SET Latin1) AS BINARY) AS utf8 FROM tbl;

+-----------+---------+
| txt       | utf8    |
+-----------+---------+
| Québec   | Québec  |
+-----------+---------+
1 row in set (0.00 sec)

...しかし、影響を受ける行を見つけるのに問題があります。あなたが見つけるかもしれないいくつかのコードポイント

WHERE txt LIKE '%Ã%'

他のものについては、手動でサンプリングする必要があります。

于 2012-10-26T14:40:25.930 に答える
3

データは失われません。この SQLFiddle の例を参照してください

于 2012-10-26T12:17:04.457 に答える
1

影響を受ける追加の行は、次を使用して見つけることができます。

SELECT column
FROM table
WHERE NOT HEX(column) REGEXP '^([0-7][0-9A-F])*$'
于 2014-01-06T12:34:33.407 に答える