社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

在带有mysql后端的django上,“操作“=”的排序规则(utf8_-general_-ci,隐式)和(utf8mb4_-general_-ci,可强制)的非法混合”[重复]

Kurt Peek • 6 年前 • 1878 次点击  

我在我的项目中使用表情符号。字符被保存了吗??)进入mysql数据库。我在中使用了数据库默认排序规则 utf8mb4_general_ci . 它显示

1366错误的字符串值:列的“\xf0\x9f\x98\x83\xf0\x9f…” 第1行的“注释”

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43296
文章 [ 8 ]  |  最新文章 6 年前
samawaat
Reply   •   1 楼
samawaat    6 年前

数据库和表 应该有字符集 utf8mb4 和校勘 utf8mb4_unicode_ci .

当创建 新数据库 您应该使用:

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

如果你有一个 现有数据库 您还需要添加支持:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

你还需要 设置正确的字符集和排序规则 对于您的桌子:

CREATE TABLE IF NOT EXISTS table_name (
    ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci;

或者如果你有 现有表 有大量数据:

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

注意 utf8_general_ci 不再推荐最佳实践。见相关问答:

What's the difference between utf8_general_ci and utf8_unicode_ci 堆栈溢出时。

Ashh
Reply   •   2 楼
Ashh    7 年前

主要的一点在上面的回答中没有提到,

我们需要传递带有选项的查询字符串 "useUnicode=yes" "characterEncoding=UTF-8" 连接字符串中

像这样的东西

mysql://USERNAME:PASSWORD@HOSTNAME:PORT/DATABASE_NAME?useUnicode=yes&characterEncoding=UTF-8
Harpreet
Reply   •   3 楼
Harpreet    7 年前

修改列的命令是:

ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME TYPE;

我们需要使用类型= BLOB

修改示例如下:

ALTER TABLE messages MODIFY content BLOB;

我检查过最新的mysql和其他数据库不需要 '' 对表名、列名等使用in命令。

获取并保存数据: 直接将聊天内容保存到列并检索数据,将数据作为字节数组获取 (byte[]) 从db列转换为 string 例如(Java代码)

new String((byte[]) arr) 
Deepak Arora
Reply   •   4 楼
Deepak Arora    7 年前

我已将数据库和表更新为从 UTF8 UTF8Mb4 . 但没什么对我有用。然后我尝试将列数据类型更新为 斑点 ,幸运的是它对我有效并且数据已经保存。甚至我的数据库和表都是 字符集utf8 collate utf8_unicode

Nicola Pedretti
Reply   •   5 楼
Nicola Pedretti    7 年前

我的回答只会增加塞尔瓦马尼的回答。

你可能还需要改变任何 SET NAMES utf8 带查询 SET NAMES utf8mb4 . 这对我来说是个骗局。

也, this is a great article 将您的网站从utf8移植到utf8mb4。特别是在将索引和修复表转换为utf8mb4之后,本文在索引和修复表方面提出了两点优点:

指标

从utf8转换为utf8mb4时,列的最大长度 或者索引键的字节数不变。因此,它更小 在字符方面,因为字符的最大长度是 现在是四个字节而不是三个。[…]innodb存储引擎的最大索引长度为767字节,因此对于utf8或utf8mb4列,最多可以分别索引255或191个字符。如果当前有索引长度超过191个字符的utf8列,则在使用utf8mb4时需要索引较少的字符。

修理桌子

在升级mysql服务器并进行必要的更改之后 如上所述,请确保修复和优化所有数据库 桌子。升级后我没有马上做这个(我不认为 是必要的,因为乍一看一切都很好, 遇到一些奇怪的错误,更新语句没有任何 效果,即使没有抛出错误。

阅读本文中有关修复表的查询的更多信息。

Miguel Almeida
Reply   •   6 楼
Miguel Almeida    7 年前

如果你使用SoR+MySQL + Java,你可以使用:

可用于:

  • 案例1:当你不想改变数据库的时候。
  • 案例2:当你需要从mysql导入到solr核心时。

在上面的例子中,这是在系统中存储表情的解决方案之一。

使用步骤:

使用的库:导入java.net.urldecoder; 导入java.net.urlencoder;

  1. 使用urlencoder对具有图释的字符串进行编码。
  2. 将其存储在db中,而不更改mysqldb。
  3. 你可以把它存储在solr core(解码形式)中 编码形式。
  4. 从db或solr core获取这些表情符号时,现在可以对其进行解码。 使用URLDecoder。

代码示例:

import java.net.URLDecoder;
import java.net.URLEncoder;

public static void main(String[] args) {
    //SpringApplication.run(ParticipantApplication.class, args);
    System.out.println(encodeStringUrl("🇺🇸🇨🇳🇯🇵🇩🇪🔳🔺🆔🆔🆑3⃣5⃣3⃣‼〽➗➗🎦🔆🎦🔆♋♍♋♍⬅⬆⬅⬅🛂🚹🛂🛄🚳🚬💊🔧💊🗿     "));
    System.out.println(decodeStringUrl("Hello+emoticons%2C%2C%F0%9F%98%80%F0%9F%98%81%F0%9F%98%8A%F0%9F%98%8B%F0%9F%98%8E%F0%9F%98%8A%F0%9F%98%8D%E2%98%BA%F0%9F%98%98%E2%98%BA%F0%9F%98%91%F0%9F%98%87%F0%9F%98%98%F0%9F%98%8B%F0%9F%90%84"));
}

public static String encodeStringUrl(String url) {
    String encodedUrl =null;
    try {
         encodedUrl = URLEncoder.encode(url, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        return encodedUrl;
    }
    return encodedUrl;
}

public static String decodeStringUrl(String encodedUrl) {
    String decodedUrl =null;
    try {
         decodedUrl = URLDecoder.decode(encodedUrl, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        return decodedUrl;
    }
    return decodedUrl;
}
ospider
Reply   •   7 楼
ospider    7 年前

步骤1,更改数据库的默认字符集:

ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

步骤2,创建表时设置字符集:

CREATE TABLE IF NOT EXISTS table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

或更改表

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name modify name text charset utf8mb4;
K-Gun diEcho
Reply   •   8 楼
K-Gun diEcho    8 年前

1)数据库:将数据库默认排序规则更改为 utf8mb4 .

2)表:将表排序规则更改为 CHARACTER SET utf8mb4 COLLATE utf8mb4_bin .

查询:

ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

3)代码:

INSERT INTO tablename (column1, column2, column3, column4, column5, column6, column7)
VALUES ('273', '3', 'Hdhdhdh😜😀😊😃hzhzhzzhjzj 我爱你 ❌', 49, 1, '2016-09-13 08:02:29', '2016-09-13 08:02:29')

4)集合 UTF8Mb4 在数据库连接中:

  $database_connection = new mysqli($server, $user, $password, $database_name); 
  $database_connection->set_charset('utf8mb4');