MySQl - 从latin1到utf8的版本上的字符串值不正确

时间:2015-02-12 20:14:37

标签: mysql utf-8 type-conversion latin1 utf8mb4

所以我们最初在我们的MySQL数据库中使用了latin1(很久很久以前),我们试图在更全面的推广之前转换为UTF8,但我遇到了过渡问题。这是我的MySQL:

/* First set as latin1 */
SET NAMES 'latin1';

/* We must change things to blob and then back again */
ALTER TABLE `address` CHANGE line_1 line_1 BLOB;
ALTER TABLE `address` CONVERT TO CHARACTER SET utf8;
ALTER TABLE `address` CHANGE line_1 line_1 VARCHAR(64);

我们得到的错误:

Incorrect string value: '\xF6gberg...' for column 'line_1' at row 7578
ALTER TABLE `address` CHANGE line_1 line_1 VARCHAR(64)

我们使用的方法基本上通过这里描述: http://www.percona.com/blog/2013/10/16/utf8-data-on-latin1-tables-converting-to-utf8-without-downtime-or-double-encoding/ 任何想法都会很棒。 (另外,由于我不是MySQL专家,不确定你需要什么样的数据,所以知道你是否还需要其他任何数据。)

更新

我试过

SET NAMES 'utf8';
SET NAMES 'utf8mb4';

我尝试使用utf8mb4,如下所述。切换到utf8mb4(我可能会保留)之后,地址的更改仍然会产生同样的问题。

更新2 所以我试着转换字符串本身来看看发生了什么,并注意到一些非常奇怪的东西:

mysql> select line_1 from address where line_1 like '%berg%';
+------------------------+
| line_1                 |
+------------------------+
| H�bergsgatan 97        |
+------------------------+

mysql> select CONVERT(line_1 USING utf8) from address where line_1 like '%berg%';
+----------------------------+
| CONVERT(line_1 USING utf8) |
+----------------------------+
| NULL                       |
+----------------------------+

mysql> select CONVERT(line_1 USING utf8mb4) from address where line_1 like '%berg%';
+-------------------------------+
| CONVERT(line_1 USING utf8mb4) |
+-------------------------------+
| NULL                          |
+-------------------------------+

mysql> select CONVERT(line_1 USING latin1) from address where line_1 like '%berg%';
+------------------------------+
| CONVERT(line_1 USING latin1) |
+------------------------------+
| Högbergsgatan 97             |
+------------------------------+

所以似乎utf不适合这个? o_O当我正在处理地址时,我能够查找它,似乎地址在斯德哥尔摩,并且应该是“Högbergsgatan97”,它与latin1相匹配。我尝试了瑞典字符编码,但这似乎也失败了:

mysql> select CONVERT(line_1 USING swe7) from address where addressid = 11065;
+----------------------------+
| CONVERT(line_1 USING swe7) |
+----------------------------+
| H?gbergsgatan 97           |
+----------------------------+

所以我试图看看我能做些什么来纠正这个问题。

另外,请注意我之前忘记说我正在使用MySQL 5.6(如果这有任何区别)

0 个答案:

没有答案