gpt4 book ai didi

character-encoding - MySQL - 更新时无效的 utf8mb4 字符串

转载 作者:行者123 更新时间:2023-12-03 16:54:36 31 4
gpt4 key购买 nike

我的问题与这里找到的问题几乎一模一样

MySQL - 1300 - Invalid utf8 character string on update

没有提出任何解决方案,该人的帮助(创建临时表)似乎没有帮助。这是我正在使用的选择语句:

SELECT
CONVERT(line_1 USING utf8mb4),
CONVERT(line_1 USING latin1),
HEX(line_1)
FROM address
WHERE ((CAST(CONVERT(line_1 USING latin1) AS CHAR)) <> (CAST(line_1 AS CHAR)))
AND CONVERT(line_1 USING utf8mb4) IS NULL;
+-------------------------------+------------------------------+----------------------------------------------------+
| CONVERT(line_1 USING utf8mb4) | CONVERT(line_1 USING latin1) | hex(line_1) |
+-------------------------------+------------------------------+----------------------------------------------------+
| NULL | Högbergsgatan 97 | 48F6676265726773676174616E203937 |
| NULL | Zücherstrasse 161 | 5AFC636865727374726173736520313631 |
| NULL | 2275, Rue de l'Université | 323237352C20527565206465206C27556E69766572736974E9 |
| NULL | Högbergsgatan 97 | 48F6676265726773676174616E203937 |
+-------------------------------+------------------------------+----------------------------------------------------+

当我尝试运行以下更新命令时,我得到:
UPDATE address
SET line_1 = CONVERT(CAST(CONVERT(line_1 USING latin1) AS CHAR) USING utf8mb4)
WHERE (CAST(CONVERT(line_1 USING latin1) AS CHAR) <> CAST(line_1 AS CHAR))
AND CONVERT(line_1 USING utf8mb4) IS NULL;
ERROR 1300 (HY000): Invalid utf8mb4 character string: 'F66762'

我尝试以下列方式设置该行,均产生相同的错误:
SET line_1 = CAST(CONVERT(line_1 USING latin1) AS CHAR)
SET line_1 = CONVERT(line_1 USING latin1)

我也看了 http://jonisalonen.com/2012/fixing-doubly-utf-8-encoded-text-in-mysql/看看是否可能是双重编码问题,但这些都不起作用,我一直收到相同的字符串错误。

此外,我查看了 https://mathiasbynens.be/notes/mysql-utf8mb4为了帮助转换步骤,但 utf8mb4 和 utf8 导致了完全相同的问题。 (起初我以为是 utf8 的东西,所以我切换到 utf8mb4,当我仍然遇到同样的问题时,我知道有一个更深层次的问题)

正如你所看到的,一些奇怪的事情正在发生。查看我的 show create address 表,我可以验证字符集设置是否正确:
SHOW CREATE TABLE address;
| address | CREATE TABLE `address` (
`addressid` bigint(20) NOT NULL AUTO_INCREMENT,
`addressuuid` char(32) COLLATE utf8mb4_unicode_ci NOT NULL,
`line_1` blob,
PRIMARY KEY (`addressid`)
) ENGINE=InnoDB AUTO_INCREMENT=48970 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='All potential addresses' |

此外,您可以看到我的字符变量在我的实例中是正确的:
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

我是怎么到这里的

因此,提供一些有关该问题的背景信息可能会有所帮助,以防万一是背景中的某些内容导致了该问题。

我有一个最初设置为 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 utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE `address` CHANGE line_1 line_1 VARCHAR(64);

切换到 blob 然后再切换回 varchar 的原因是正常的推荐过程。 (www.percona.com/blog/2013/10/16/utf8-data-on-latin1-tables-converting-to-utf8-without-downtime-or-double-encoding/)

让我知道这是否有帮助,以及是否可以提供更多信息。我使用的是 MySQL 5.6,所以理论上它应该可以更好地处理事情,但谁知道呢。由于只有 4 行,我只能手动更新每一行,但理论上存在更大的潜在问题,而且由于我实际上还有相当多的列要浏览,因此最好确保我有一种功能性的方式来处理这些情况,以防我得到很多行的东西。

最佳答案

line_1是一个blob,而不是文本字段,MySQL无法控制其中的“字符”,也不关心它是否是非文本信息(例如JPG)。在您提供的示例中,字段中有 latin1 文本(例如,ö 的十六进制 F6)。因此,CONVERT(line_1 USING latin1)工作“很好”。

我不明白你的目标。您是否试图将 BLOB 作为文本阅读?如果是这样,并且如果所有非 ascii 字符都编码为 latin1,那么 CONVERT 就是答案。

如果您的目标是别的,那么让我们从那里着手。

它不是“双重编码”,所以它们都不起作用。

ALTER TABLE address CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;



做一个 SHOW CREATE TABLE address并检查 line_1 的字符集.

关于character-encoding - MySQL - 更新时无效的 utf8mb4 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28495403/

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