gpt4 book ai didi

mysql - 无效的 utf8 字符串。将 "latin1_german1_ci"列完全转换为 UTF8

转载 作者:行者123 更新时间:2023-11-29 09:35:09 25 4
gpt4 key购买 nike

我有一个表,其中有一列的数据似乎不是 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' |
+---------+------+-----------------------------------------+

使用BINARY() 消除了对字符串当前编码形式的任何假设。因此它采用最简单的方法并假设字符串已经是 utf8

这可能是最短的方法:

mysql> SELECT CONVERT(CONVERT(@in USING latin1) USING utf8);
+-----------------------------------------------+
| CONVERT(CONVERT(@in USING latin1) USING utf8) |
+-----------------------------------------------+
| übe |
+-----------------------------------------------+

但是...该列的字符集是什么?如果是 latin1,你的情况就会变得更糟。在没有进一步测试的情况下,请勿进行任何更改。 Here有几种情况以及每种情况的修复方法。在弄清楚您是否遇到这种情况之前,不要急于采用一种解决方案;你可能会让事情变得更糟。另请参阅Trouble with UTF-8 characters; what I see is not what I stored

示例

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
+----------+

关于mysql - 无效的 utf8 字符串。将 "latin1_german1_ci"列完全转换为 UTF8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57824516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com