Php Mysql十六进制函数,用于解码多字节utf8

Php Mysql十六进制函数,用于解码多字节utf8,php,mysql,utf-8,character-encoding,mysqli,Php,Mysql,Utf 8,Character Encoding,Mysqli,MySQL使用一个函数HEX将字符序列转换为十六进制表示。唯一的问题是它假定每个字符是两个字节。这在大多数情况下都很好,但对于utf-8,有时会出现跨越2个字节以上的字符 比如说。0xEFBFBD是用于表示编码错误的三字节字符。当我在一个utf8编码的表中,在DB 6字节中有两个字符一个接一个,然后我尝试从表中选择HEXcol1…,结果显示为0xC3AFC2BFC2BD,而不是0xEFBFBD。如果我使用php中的查询选择它,然后在php中将其转换为十六进制,它将作为正确的格式显示出来 最好的功

MySQL使用一个函数HEX将字符序列转换为十六进制表示。唯一的问题是它假定每个字符是两个字节。这在大多数情况下都很好,但对于utf-8,有时会出现跨越2个字节以上的字符

比如说。0xEFBFBD是用于表示编码错误的三字节字符。当我在一个utf8编码的表中,在DB 6字节中有两个字符一个接一个,然后我尝试从表中选择HEXcol1…,结果显示为0xC3AFC2BFC2BD,而不是0xEFBFBD。如果我使用php中的查询选择它,然后在php中将其转换为十六进制,它将作为正确的格式显示出来

最好的功能是MySql,它可以正确解码多字节UTF8。我很惊讶它似乎不存在,我想知道是否有其他人也发现了这种情况以及可能的解决办法

我在MySql中找到的最接近答案是:

但是这个建议并没有真正的帮助。如果没有人有任何想法,我将在稍后发布一个测试用例。

HEX函数返回实际存储的字节;请记住,MySQL愉快地存储了字符编码的混合。如果为每个字符获取两个字节,则必须对值进行编码。要检查编码,可以使用

在这种情况下,该列似乎包含쎯슿슽 U+C3AF U+C2BF U+C2BD编码为UTF-16。一定还有别的事情让你相信�� U+FFFD U+FFFD是存储值。也许您的PHP程序使用ucs2或utf16作为连接字符集,然后将获得的文本视为UTF-8

更新:要获取字符串UTF-8编码的十六进制表示形式-任何字符串,在任何编码*-中,使用HEXCONVERTstring和utf8。例如:

set @unknown = char(0xFFFD using ucs2);        -- stored bytes: \xFF \xFD
select hex(convert(@unknown using utf8));      -- output: EFBFBD

*实际上,除了没有编码转换的二进制字符串之外,表字符集和php都是utf-8。这个�� 字符在我要处理的原始文件中。IE我在hexedit中查看了这个文件的原始数据,它有两个0xEFBFBD,一个接一个。因此,这将作为0xEFBFBD正确地存储在数据库中。但是,如果我想用sql编写一个脚本来修复这些字符,那么在sql中没有多字节十六进制解码函数似乎很困难。我已经用PHP解决了这个问题,但我仍然感兴趣的是,是否有人知道MySql十六进制函数的一个调整,该函数允许正确解码utf-8。请注意,如果我使用PHP中的查询选择它,然后在PHP中将其转换为十六进制,它正确地表示为0xEFBFBD。然后,看起来问题在于插入数据的方式:该列不包含两个U+FFFD字符。关于如何获得字符串UTF-8编码的十六进制表示,请参阅更新。这个SELECT col,HEXCONVERTcol使用表中的utf8现在工作得很好。我确实发现SHOW变量中的一些变量(如“%char%”)仍然设置为拉丁字母1,这可能是问题的一部分。另一方面,我发现其他一些字符需要mysqli\u set\u字符集$conn,utf8;要在数据库中正确编码。