Py学习  »  Django

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

Kurt Peek • 6 年前 • 2171 次点击  

我在我的项目中使用表情符号。字符被保存了吗??)进入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    7 年前

数据库和表 应该有字符集 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    8 年前

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

Nicola Pedretti
Reply   •   5 楼
Nicola Pedretti    8 年前

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

你可能还需要改变任何 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    8 年前

如果你使用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    8 年前

步骤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');