首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无效的utf8字符串。将"latin1_german1_ci“列完全转换为UTF8

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

Stack Overflow用户
提问于 2019-09-06 23:05:56
回答 2查看 374关注 0票数 0

我有一个表,其列的数据似乎不是UTF8。我想将该列转换为UTF8。

我发现了一个很棒的教程:https://coderwall.com/p/gjyuwg/mysql-convert-encoding-to-utf8-without-garbled-data

然而,这些解决方案都没有真正起作用。

当我这样做的时候

代码语言:javascript
复制
UPDATE vbpmtext 
SET message = @txt 
WHERE char_length(message) =  LENGTH(@txt := CONVERT(BINARY CONVERT(message USING latin1) USING utf8));

我收到了一大堆这样的错误:

代码语言:javascript
复制
Invalid utf8 character string: 'FC6265'

使用不同的“字符串”(FC6265只是一个例子)。

有什么方法可以挽救这些数据吗?

我们所说的列自然是用latin1_german1_ci排序规则格式化的。

EN

回答 2

Stack Overflow用户

发布于 2019-09-07 00:39:02

解释为latin1,FC6265übe。( cp1250、cp1256、cp1257、dec8、latin2、latin5、latin7也是如此。)

3个字符的字符串是übe吗?或6个字符的字符串FC6265

代码语言:javascript
复制
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

这可能是最短的方法:

代码语言:javascript
复制
mysql> SELECT CONVERT(CONVERT(@in USING latin1) USING utf8);
+-----------------------------------------------+
| CONVERT(CONVERT(@in USING latin1) USING utf8) |
+-----------------------------------------------+
| übe                                           |
+-----------------------------------------------+

但是...列的字符集是什么?如果是latin1,那你就把事情搞得更糟了。在没有进行进一步测试之前,不要做任何更改。是几种情况以及每种情况的修复方法。在弄清楚你是否有这种情况之前,不要匆忙进入一个解决方案;你很可能会让事情变得更糟。另请参阅Trouble with UTF-8 characters; what I see is not what I stored

示例

代码语言:javascript
复制
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
+----------+
票数 1
EN

Stack Overflow用户

发布于 2019-09-07 03:47:28

好吧,所以这是我的错。并不是数据本身被破坏了,而是我在数据上使用了php substr方法,它在不合适的地方删除了数据。这里找到了一个解决方案:php substr() function with utf-8 leaves � marks at the end

代码语言:javascript
复制
$var = "Бензин Офиси А.С. также производит все типы жира и смазок и их побочных        продуктов в его смесительных установках нефти машинного масла в Деринце, Измите, Алиага и Измире. У Компании есть 3 885 станций технического обслуживания, включая сжиженный газ (ЛПГ) станции под фирменным знаком Петрогаз, приблизительно 5 000 дилеров, двух смазочных смесительных установок, 12 терминалов, и 26 единиц поставки аэропорта.";

$foo = mb_substr($var,0,142, "utf-8");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57824516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档