General error: 1366 Incorrect string value: '\xF0\x9F\xA7\x9A\xE2\x80...' for column 'content'

疑难杂症   2024-01-22 11:44   108   0  

Mysql 1366 错误是因为插入的数据编码与数据表设置编码冲突所导致的。

 

通过日志发现,是由于插入的内容有特殊表情,而数据表的格式,是utf8_general_ci规则的。

 

解决方式:

 

1. 在此字段插入数据时,将数据进行 base64编码存入数据库。用的时候在decode解码后显示

  1.  

  最常见的是,做微信开发时,客户的微信昵称千奇百怪的,各种符号,一定要做处理才存进数据库

 

2. 去除特殊符号

 

 php删除微信名称表情符号

public static function removeEmoji($text)
{
    if ($text == '') return '';

    $clean_text = "";
    // Match Emoticons    $regexEmoticons = '/[\x{1F600}-\x{1F64F}]/u';
    $clean_text = preg_replace($regexEmoticons, '', $text);
    // Match Miscellaneous Symbols and Pictographs    $regexSymbols = '/[\x{1F300}-\x{1F5FF}]/u';
    $clean_text = preg_replace($regexSymbols, '', $clean_text);
    // Match Transport And Map Symbols    $regexTransport = '/[\x{1F680}-\x{1F6FF}]/u';
    $clean_text = preg_replace($regexTransport, '', $clean_text);
    // Match Miscellaneous Symbols    $regexMisc = '/[\x{2600}-\x{26FF}]/u';
    $clean_text = preg_replace($regexMisc, '', $clean_text);
    // Match Dingbats    $regexDingbats = '/[\x{2700}-\x{27BF}]/u';
    $clean_text = preg_replace($regexDingbats, '', $clean_text);

    $message = json_encode($clean_text);
    return json_decode(preg_replace("#(\\\ud[0-9a-f]{3})#i", "", $message), true);
    //return $clean_text;
}

3. 修改数据库编码

 

众所周知,mysql的utf8mb4才是真正的utf8编码。

 

在网上看到一些文章说,将数据库的字符集改成utf8mb4就可以存储表情了。

 

其实在前两年我做过一个实验发现,修改编码后有某些表情还是无法存入数据库= . = (有可能是表情迭代太快啦?)


博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。
闲言碎语
厉害的不是你有多少后台,而是你能成为多少人的后台!
赞赏支持

如果觉得博客文章对您有帮助,异或土豪有钱任性,可以通过以下扫码向我捐助。也可以动动手指,帮我分享和传播。您的肯定,是我不懈努力的动力!感谢各位亲~