当我写特殊的latin1字符时,例如
á,éã,ê
到一个utf-8编码的mysql表,数据丢失了吗?
该表的字符集是utf-8。
有没有办法让latin1编码的行回来,所以我可以转换为utf-8并回写(这次以正确的方式)?
更新
我认为我对“数据”的含义并不十分具体。根据数据,我指的是特殊字符,而不是行。
选择时,我仍然会获得行和字段,但是“?”而不是特殊的latin1字符。有可能恢复那些'?'并转换为正确的utf8?
答案 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])*$'