Mysql在某些情况下无法保存UTF字符串

Mysql在某些情况下无法保存UTF字符串,mysql,Mysql,在垃圾邮件战斗中,我发现一些垃圾邮件评论没有任何内容 在尝试隔离问题后,以下是我在将类似注释与MySQL数据库一起保存到文件后发现的内容 这是(十六进制,因为输入编码未知)注释前几个“字符”的样子: D1EA E0F7 E0F2 FC20 EFEE EFF3 EBFF F0ED FBE5 20EF F0EE E3F0 E0EC ECFB 执行插入测试值(0xD1EAE0F7E0F2FC20EFEEEFF3EBFFF0EDFBE520EFF0EEE3F0E0ECECFCB21),(0x21D1E

在垃圾邮件战斗中,我发现一些垃圾邮件评论没有任何内容

在尝试隔离问题后,以下是我在将类似注释与MySQL数据库一起保存到文件后发现的内容

这是(十六进制,因为输入编码未知)注释前几个“字符”的样子:

D1EA E0F7 E0F2 FC20 EFEE EFF3 EBFF F0ED FBE5 20EF F0EE E3F0 E0EC ECFB
执行
插入测试值(0xD1EAE0F7E0F2FC20EFEEEFF3EBFFF0EDFBE520EFF0EEE3F0E0ECECFCB21),(0x21D1EAE0F7E0F2FC20EFEEEFF3EBFFF3EBEFF3EBEFF3EBE520EFF0EEE3F0E0ECECECFCB),(0x21)
测试mysql表(utf-8)包含3行,第一行没有任何文本,第二行和第三行以单个字符“!”作为文本。。。(请注意,“!”的21十六进制代码也位于第一个条目的末尾,但未保存)。(拉丁1编码为每个字节保存了一些无用的文本替换,但这篇文章不是关于它的)

当然,D1EA(D=1101 0001后面应该跟一个10xxxxxx字节,而不是1110xxxx)不是有效的UTF-8字符,但是像数据库服务器这样的健壮系统应该能够处理它

我的猜测是,Mysql(版本5.1.66-0+squeeze1)不应该选择何时保存数据,何时不保存数据,即使它不是有效的UTF-8编码字符。。。或者至少,当它决定不存储数据时,不应该声明查询已成功

这是mysql中的bug还是什么


谢谢

编码为Windows-1251,解码为

Скачать популярные программы
//"Download popular software" google translated
在对代码进行任何操作之前,应该拒绝非UTF8输入

if( !mb_check_encoding($input, "UTF-8") ) {
    header("HTTP/1.1 400 Bad Request");
    die("Invalid encoding");
}

FTR,您的查询是十六进制文字,而不是错误编码的文本。

谢谢,我将使用此选项来防止此类垃圾评论。。。然而,mysql没有保存声称已成功保存的数据的问题仍然存在,而且这不是通用的解决方案。您必须修改每个系统以检查请求编码。但每个系统都已经检查了mysql查询的结果,所以应该是mysql告诉我们,“不,这些数据还没有保存”,而不是“好的,继续”。。。