首页 > 解决方案 > MySQL获取字符串中的X字节

问题描述

我有一个数据库,我试图从中提取一些数据,我们正在将一个客户从另一个客户转换到我们的系统,并且源数据库有一个名为linevarchar 的字段。

但是该字段不只包含文本,字符串的第一个 x 字节是状态代码,它们只是字节,因此作为示例Â foo,在十六进制编辑器中读取时可能会读取一行03 C2 A0 66 6F 6F

我正在尝试在 MySQL 中运行查询以显示第三个字节的内容,但是我没有得到正确的结果。我怀疑 MySQL 将字符视为 UTF-8,当我使用子字符串时,我得到一个两字节字符

我尝试了几件事,第一件事是HEX(ASCII(SUBSTRING(CONVERT(line USING utf8mb4), 3, 1)))。我还尝试将 '''CONVERT(line USING utf8mb4)''' 替换为 '''CONVERT(line, BINARY) ''' 这会产生相同的结果。

当我读到第一个字符时,我得到了 03,我读到了第二个字符,我得到了 C2,当我尝试第三个字符时,我得到了 0 而不是 A0。

我刚刚尝试从该字段复制输出并将其作为字符串文字,并且效果很好,只有在从数据库中读取它时。

这有效

HEX(ASCII(SUBSTRING(CONVERT(' ', BINARY),3, 1))) -- 字符串为以下十六进制值 03C2A0

这不起作用

HEX(ASCII(SUBSTRING(CONVERT(line, BINARY),1, 1))) -- 行包含与上述示例相同的字符串。

关于什么会起作用的任何建议?理想情况下,我需要将此作为查询而不是任何后期操作。

谢谢安迪。

标签: mysqlstringtype-conversionbyte

解决方案


几天后我确实明白了这一点。我确实认为我发布了我自己问题的解决方案。

就像将行数据转换为 utf8mb4 然后转换为二进制一样简单,这让我可以访问行中的每个字节。

HEX(ASCII(substring(CONVERT(CONVERT(line using utf8mb4), BINARY),4,1)))

必须同时使用两者,这是我一开始没有看到的。

我希望这可以帮助将来的人。

干杯。


推荐阅读