当我将特殊的latin1字符写入utf-8编码的mysql表时,该数据是否丢失了?

时间:2012-10-26 12:06:41

标签: mysql

当我写特殊的latin1字符时,例如

á,éã,ê

到一个utf-8编码的mysql表,数据丢失了吗?

该表的字符集是utf-8。

有没有办法让latin1编码的行回来,所以我可以转换为utf-8并回写(这次以正确的方式)?

更新

我认为我对“数据”的含义并不十分具体。根据数据,我指的是特殊字符,而不是行。

选择时,我仍然会获得行和字段,但是“?”而不是特殊的latin1字符。有可能恢复那些'?'并转换为正确的utf8?

3 个答案:

答案 0 :(得分:4)

如果整个数据库(或整个表)受到影响,您可以先验证它是SET NAMES Latin1的Latin1-as-UTF8字符集问题:

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 '%Ã%'

但对于其他人,您必须手动进行采样。

答案 1 :(得分:3)

数据不会丢失。见this SQLFiddle example

答案 2 :(得分:1)

可以使用以下方法找到其他受影响的行:

SELECT column
FROM table
WHERE NOT HEX(column) REGEXP '^([0-7][0-9A-F])*$'