我试图使用下面的查询对列数据强制使用UTF-8编码。

SELECT convert(binary convert(summary using latin1) using utf8) FROM blogs b;

在mysql控制台中记录以下警告
mysql - MYSQL警告无效的utf8字符串-LMLPHP
以上警告中的下列字符代表什么?
'AE2065','927320','927320','927320','F16120','C02070','AE2043','F16F6C','93426F','93426F','E4646F','E46E73','E46DE4','E47974','C02070','934355','934355'
如何找出上面列表对应的实际字符符号?

最佳答案

好吧,给定这些源字符集,就得到了这个文本。例如,有几个将AE视为®

CONVERT(CONVERT(UNHEX('AE2065') USING %s) USING utf8mb4):

cp1250, cp1251, cp1256, cp1257, geostd8, hebrew, latin1, latin5, latin7
                                            4  3 '® e'
                    cp850, cp852, keybcs2   4  3 '« e'
                                    cp866   4  3 'о e'
                                      hp8   4  3 'Û e'
                                   latin2   4  3 'Ž e'
                                    macce   4  3 'ģ e'
                                 macroman   4  3 'Æ e'
                                 armscii8   5  3 '… e'
                              cp932, sjis   5  3 'ョ e'
                             koi8r, koi8u   5  3 '╝ e'
                                   tis620   5  3 'ฎ e'

对于92,可能的解释是
CONVERT(CONVERT(UNHEX('927320') USING %s) USING utf8mb4)

                              cp932, sjis   4  2 '痴 '
                                    euckr   4  2 '뭩 '
                                      gbk   4  2 '抯 '
                                    cp850   4  3 'Æs '
                                    cp852   4  3 'ĺs '
                                    cp866   4  3 'Тs '
                                  keybcs2   4  3 'Žs '
                          macce, macroman   4  3 'ís '
cp1250, cp1251, cp1256, cp1257, geostd8, latin1
                                            5  3 '’s '

到目前为止,我发现latin1很常见。我再试试:
CONVERT(CONVERT(UNHEX('F16120') USING %s) USING utf8mb4)

                                     big5   4  2 '鎙 '
                                    cp932   4  2 ' '
                                      gbk   4  2 '馻 '
                                 armscii8   4  3 'րa '
cp1250, cp1257, dec8, latin1, latin2, latin5, latin7
                                            4  3 'ña '
                                   cp1251   4  3 'сa '
                           cp850, keybcs2   4  3 '±a '
                                    cp852   4  3 '˝a '
                                    cp866   4  3 'ёa '
                                    greek   4  3 'ρa '
                                   hebrew   4  3 'סa '
                                      hp8   4  3 'þa '
                             koi8r, koi8u   4  3 'Яa '
                                    macce   4  3 'Ůa '
                                 macroman   4  3 'Òa '
                                   tis620   5  3 '๑a '

同样,拉丁美洲人也有可能。
所以,。。。您需要做的是声明您输入到MySQL的字节是在latin1中编码的。然后它们将自动转换为列的声明,该声明应该是utf8(如果您想要中文和Emoji,则应该是utf8mb4)。
因为表中似乎已经有了latin1字节(在summary列中),所以您是否有utf8并不是问题;您没有utf8。该列未声明为utf8。
那么,你真的想做什么??也许你想把字符集改成utf8?见
ALTER TABLE ... CONVERT TO ...

你所拥有的很接近:
CONVERT(BINARY CONVERT(UNHEX('AE2065') USING latin1) USING utf8) --> Warning
CONVERT(       CONVERT(UNHEX('AE2065') USING latin1) USING utf8) --> '® e'

但是,那你怎么处理呢?如果列是latin1,并且将转换后的内容粘贴回中,则会得到“双重编码”,使情况更糟。
也许你也有utf8编码的字符在拉丁1列中?真是一团糟——“双重编码”。
请参见Trouble with UTF-8 characters; what I see is not what I stored然后进一步阐述您的问题。

关于mysql - MYSQL警告无效的utf8字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48786155/

10-14 08:09