mysql - 无效的 utf8 字符串。将“latin1_german1_ci”列完全转换为 UTF8
问题描述
我有一个表,其中有一列的数据似乎不是 UTF8。我想将该列转换为 UTF8。
我发现了这个精彩的教程:https ://coderwall.com/p/gjyuwg/mysql-convert-encoding-to-utf8-without-garbled-data
但是,这些解决方案都没有真正起作用。
当我做
UPDATE vbpmtext
SET message = @txt
WHERE char_length(message) = LENGTH(@txt := CONVERT(BINARY CONVERT(message USING latin1) USING utf8));
我收到很多这样的错误:
Invalid utf8 character string: 'FC6265'
使用不同的“字符串”(FC6265 只是一个例子)。
有什么办法可以挽救这些数据吗?
我们所说的列自然是使用排序规则格式化的latin1_german1_ci
。
解决方案
解释为 latin1,FC6265
是übe
. (同样适用于 cp1250、cp1256、cp1257、dec8、latin2、latin5、latin7。)
是@txt
3 个字符的字符串übe
吗?还是 6 个字符的字符串FC6265
?
mysql> SET @in := UNHEX('FC6265');
mysql> SELECT HEX(@in);
+----------+
| HEX(@in) |
+----------+
| FC6265 |
+----------+
mysql> SELECT HEX( CONVERT(@in USING latin1) );
+----------------------------------+
| HEX( CONVERT(@in USING latin1) ) |
+----------------------------------+
| FC6265 |
+----------------------------------+
mysql> SELECT HEX( BINARY(CONVERT(@in USING latin1)) );
+------------------------------------------+
| HEX( BINARY(CONVERT(@in USING latin1)) ) |
+------------------------------------------+
| FC6265 |
+------------------------------------------+
mysql> SELECT HEX( CONVERT(BINARY CONVERT(@in USING latin1) USING utf8) );
+-------------------------------------------------------------+
| HEX( CONVERT(BINARY CONVERT(@in USING latin1) USING utf8) ) |
+-------------------------------------------------------------+
| |
+-------------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)
mysql> SHOW WARNINGS;
+---------+------+-----------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------+
| Warning | 1300 | Invalid utf8 character string: 'FC6265' |
+---------+------+-----------------------------------------+
UsingBINARY()
消除了对字符串当前编码为的任何假设。所以它采用最简单的方法并假设字符串已经是utf8
.
这可能是最短的方法:
mysql> SELECT CONVERT(CONVERT(@in USING latin1) USING utf8);
+-----------------------------------------------+
| CONVERT(CONVERT(@in USING latin1) USING utf8) |
+-----------------------------------------------+
| übe |
+-----------------------------------------------+
但是......列的字符集是什么?如果它是 latin1,那么您将变得更糟。未经进一步测试,请勿进行任何更改。 以下是几种情况以及每种情况的修复方法。在确定您是否有这种情况之前,不要急于解决一个问题;你可能会让事情变得更糟。另请参阅UTF-8 字符的问题;我看到的不是我存储的
例子
mysql> CREATE TABLE ube ( c VARCHAR(8) CHARSET latin1 COLLATE latin1_german1_ci );
mysql> INSERT INTO ube (c) VALUES (UNHEX('FC6265'));
mysql> SELECT HEX(c) FROM ube;
+--------+
| HEX(c) |
+--------+
| FC6265 | -- Note the latin1 encoding
+--------+
mysql> ALTER TABLE ube CONVERT TO CHARACTER SET utf8mb4;
Query OK, 1 row affected (0.04 sec)
Records: 1 Duplicates: 0 Warnings: 0 -- Note: no errors
mysql> SELECT HEX(c) FROM ube;
+----------+
| HEX(c) |
+----------+
| C3BC6265 | -- Now utf8mb4 encoding
+----------+
推荐阅读
- c# - 如何使用 Serilog 和 ElasticSearch 拥有不同的日志类型
- javascript - 如何更改 eslint 设置以了解绝对导入?
- security - TransformerConfigurationException:无法为 Transformer 设置功能
- c++ - c++程序在运行时停止工作
- php - 保险丝安装的存储桶显示 403 禁止错误
- c++ - C++中的退出选项和while循环
- mysql - 如何根据属性名称过滤 mysql 中的 JSON 数据类型?
- javascript - 如何在 React Native 中添加支付网关集成?
- linux - Linux 日志服务器权限被拒绝
- javascript - 创建异步多级向下钻取 - Highcharts