【发布时间】:2021-01-27 08:42:48
【问题描述】:
我有一个 MySQL 转储,它不是有效的 UTF-8。两个问题:
- 这可能是由某些使用 utf8mb3 aka MySQL 的 'utf8' 的数据库引起的吗?它确实使用了这种编码。
- 如果是这样,我该如何解决它,而无需访问 MySQL 来导入、更改表类型和重新导出?我可以使用任何编码转换工具吗?
编辑以添加无效 UTF-8 的特定数据:
uconv -f utf8 a.sql -o /dev/null
Conversion to Unicode from codepage failed at input byte position XXX. Bytes: ed Error: Illegal character found
这是一个十六进制示例。
xxd -s {XXX-16} -l 30 a.sql
YYY: 6e2e 203c 2f70 3e20 cfa1 ecaf a6eb 9ea0 n. </p> ........
aabb aabb aabb aabb aaaa bbbb bbaa aaaa
YYZ: edb6 b0e1 aea5 ee9e a027 2c27 3230 .........','20
^^^^ ^^
编辑 2:在上面添加了更多上下文。看起来问题序列符合UTF-8格式,它只是映射到不存在的U+1DDB0。
【问题讨论】:
-
不清楚。让我们看看“无效转储”的一小部分的十六进制。
utf8是utf8mb4的子集,因此 utf8mb3 不会造成任何问题。SHOW VARIABLES LIKE 'char%'. -
"which is not valid UTF-8" - 请举例说明你是如何得出这个结论的,以便我们排除潜在的错误结论。
-
添加了示例。 @RickJames 您可以为您的声明提供引用/链接吗?我知道“utf8”字符是“utf8mb4”字符的子集,但我没有“utf8mb3”规范来验证一种编码是另一种编码的子集。
-
我确实添加了前导字节——“a6”不是违规字节:)
标签: mysql utf-8 character-encoding utf8mb4