zoukankan      html  css  js  c++  java
  • Django1.10+Mysql 5.7存储emoji表情,报Incorrect string value: '\xF0\x9F\x90\xA8' for column 'signature' at row 1的解决方法

    问题:

      在做webapp项目的时候,用户提交emoji数据,控制台报错:Incorrect string value: '\xF0\x9F\x90\xA8' for column 'signature' at row 1。

    原因:

      原mysql数据库的编码格式是utf8,mysql在存储数据的时候用的是3个字节去存储。而emoji表情要用4个字节的utf8,也就是utf8mb4格式。

    解决方法:

      首先需要修改mysql的配置文件: windows--> my.ini  linux-->/etc/mysql/my.cnf 

    [client]  
    default-character-set = utf8mb4  
      
    [mysql]  
    default-character-set = utf8mb4  
      
    [mysqld]  
    character-set-client-handshake = FALSE  
    character-set-server = utf8mb4  
    collation-server = utf8mb4_unicode_ci  

    然后重启,mysql,查看mysql编码:

    SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

    修改完数据库后,创建数据库:

    create database database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;  

    在查看django源码中:django/db/backends/mysql/base.py 中的DatabaseWrapper类中有个kwargs的属性,里面有个key叫charset,默认值是utf8,后面做数据库连接的时候,会用django的settings中,database的options去更新这一项。

    class DatabaseWrapper(BaseDatabaseWrapper):  
      
        def get_connection_params(self):  
            kwargs = {  
                'conv': django_conversions,  
                'charset': 'utf8',  
            }  

    因此需要修改Django--settings中mysql 连接:

    在数据库连接配置中增加options项:

    'OPTIONS':{'charset':'utf8mb4'},

    再次尝试 成功!

    对于mysql数据库格式为utf8且已经存在数据的情况:

    1、修改mysql 配置文件,重启

    2、将数据库编码格式更新为utf8mb4

    ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

    3、再将对应的表编码格式更新为utf8mb4

    ALTER TABLE  table_name  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

    4、修改django--settings中mysql连接,增加

    'OPTIONS':{'charset':'utf8mb4'},

    5、尝试,可成功!

  • 相关阅读:
    NSSelectorFromString 使用示例
    NSClassFromString 实例话静态库中的类
    iOS Simulator hang up ( Xcode4.6.3)
    RabbitMQ 相关概念和方法详解
    Python pika, TypeError: exchange_declare() got an unexpected keyword argument 'type' 问题修复
    巧用 git rebase 将某一部分 commit 复制到另一个分支
    巧用 git rebase 合并多个 commit。
    分享常用的GoLang包工具
    Laradock使用教程(新手版)
    PHP中抽象类与接口的区别
  • 原文地址:https://www.cnblogs.com/os-python/p/6831478.html
Copyright © 2011-2022 走看看