我有一个看起来像这样的字符串:
现在,当我的应用程序将此字符串推入其utf8 mysql数据库列时,它在MySQL CLI中看起来像这样:
如果我选择convert(mystring using utfmb4)
,它仍然是这样的。
如果我使用select hex(mystring) from mytable;
将其变为十六进制,它看起来像这样:
C3A2CB9CE282ACC3AFC2B8C28FC3B0C5B8C592CB86C3B0C5B8C592C5A0C3B0C5B8C592C281C3B0C5B8E280A1C2ACC3B0C5B8E280A1C2A7
现在,假设我想在其中找到带有表情符号波形的字符串。那么,wave表情符号的十六进制是F09F8C8A
。但F09F8C8A
不在上面的十六进制中,因此像select * from mytable where hex(mystring) like '%F09F8C8A%';
这样的东西不起作用。
有什么建议吗?
答案 0 :(得分:1)
我称之为“双重编码”。你的客户声称它有latin1字符,但告诉MySQL他们应该是utf8,所以一个3字节的utf8字符在数据库中被转换为6字节。
您需要修复表中的客户端和数据。 此链接讨论它:http://mysql.rjweb.org/doc.php/charcoll。 (对不起,没有关于如何解决问题的简要摘要。) issues和fixes。