【MySQL篇】使用mysqldump导入报错Unknown collation: ‘utf8mb4_0900_ai_ci‘的问题解决

💫《博主介绍》:✨又是一天没白过,我是奈斯,从事IT领域✨

💫《擅长领域》:✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(MongoDB)有了解✌️

💖💖💖大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注💖💖💖

    如标题所示本篇文章是记录一下使用mysqldump导出的SQL文件进行导入时的报错Unknown collation: 'utf8mb4_0900_ai_ci'。众所周知mysqldump是MySQL的逻辑迁移工具,它能够将数据库的内容以 SQL语句的形式导出为文件 ,为数据库的迁移、备份和恢复工作提供了极大的便利。

    但mysqldump导入时很鸡肋真的让人有些哭笑不得,就是使用mysql命令进行导入的,所以 没有办法看到每张表的导入情况 ,也没有办法指定某个表、某个库的导入,导入一个mysqldump导出的sql文件,然后它默默地在那边工作,你除了等待和祈祷,只能 看看后台这个导入进程还是否存在 ,几乎什么都做不了。虽然mysqldump导入有些“鸡肋”,但我们也不要太过苛求。毕竟它为我们提供了基本的数据库备份和恢复功能,这已经足够我们在很多场景下使用了。如果真的需要更高级的功能,那也不妨考虑一下那些收费的商业软件,它们或许能给你带来更好的体验。

    那么回到正题   这个报错当时是研发人员需要将MySQL8.0中的某个生产库的全量数据导入到MySQL5.7时抛出的错误,属于降版本导入数据。

    其实这个需求挺奇葩的,明明已经是高版本MySQL8.0了,MySQL8.0不管是性能上还是新功能上都要比MySQL5.7强,为啥还需要降版本导入到MySQL5.7中呢?原因是因为目前其他项目上有用MySQL8.0的,还有尝试用最新的MySQL8.1等版本的,但当前需要协助导入数据的项目上还用的是MySQL5.7,这个项目要拉其他项目上的数据来进行测试,如果不同版本上的数据都单独创建一个对应版本实例的话,使用MySQL自带的federated功能联调就比较麻烦,并且最要命的是使用federated功能只支持select、insert、update、delete、truncate和索引,不支持ALTER TABLE或任何直接影响表结构的数据定义语句(执行ALTER TABLE报错:ERROR 1031 (HY000): Table storage engine for 'liu_mysqloltp_ywcs_tb88' doesn't have this option),所以最好的办法就是统一将不同版本上的数据统一导入到一个版本中。大家都知道使用mysqldump升版本的导入导出没问题,也就是支持向上兼容;但mysqldump导出的SQL文件不支持降版本导入,所以就需要对导出的SQL文件进行一下处理。

              

问题描述:

在MySQL8.0环境中导出某个生产库的全部对象,执行如下mysqldump导出语句:

[root@mgr1 ~]# mysqldump -uroot -p123456 --set-gtid-purged=OFF --single-transaction --master-data=2 --flush-logs --routines --events --databases liudbywcs --log-error=mysqldump_liudbywcs_3306_err.log  --skip-add-locks  --socket=/liu_data/mysql8.0/data/3306/liu.sock   > mysqldump_liudbywcs_3306.sql

                  

然后将MySQL8.0中mysqldump导出的SQL文件,通过mysql客户端命令导入到MySQL5.7环境中:

[root@ha1 ~]# mysql -uroot -p123456 --socket=/liu_data/mysql5.7/data/3306/liu.sock --force < mysqldump_liudbywcs_3306.sql 

                              

在MySQL5.7环境中通过mysql客户端命令导入时报错信息如下:

mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1273 (HY000) at line 28: Unknown collation: 'utf8mb4_0900_ai_ci'
ERROR 1253 (42000) at line 28: COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'utf8mb4'
ERROR 1049 (42000) at line 30: Unknown database 'liudbywcs'
ERROR 1046 (3D000) at line 36: No database selected
ERROR 1046 (3D000) at line 39: No database selected
ERROR 1046 (3D000) at line 53: No database selected
ERROR 1046 (3D000) at line 54: No database selected
...............

                   

解决办法:

    分析上面两个报错Unknown collation: 'utf8mb4_0900_ai_ci'和COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'utf8mb4'。

  • 报错一:Unknown collation: 'utf8mb4_0900_ai_ci'。在MySQL5.7中不支持这个字符集排序规则(collation),所以需要替换成MySQL5.7支持的utf8mb4_general_ci字符集排序规则(collation)。
  • 报错二:COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'utf8mb4'。utf8_general_ci 不适用于 utf8mb4 字符集,应该使用 utf8mb4_general_ci 或 utf8mb4_unicode_ci 排序规则来避免该错误。

    如果MySQL5.7的默认字符集是utf8,那么将导出来的SQL文件的字符集和排序规则修改如下:

sed -i 's/utf8mb4_0900_ai_ci/utf8_general_ci/g' SQL文件
sed -i 's/utf8mb4_general_ci/utf8_general_ci/g' SQL文件
sed -i 's/utf8mb4/utf8/g' SQL文件

    如果MySQL5.7的默认字符集是utf8mb4,那么将导出来的SQL文件的字符集和排序规则修改如下:

sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_general_ci/g' SQL文件

                         

扩展(MySQL的字符集和排序规则):

字符集:

    字符集(Character Set)在 MySQL 中定义了如何将字符映射到字节。它是决定如何存储和表示文本数据的基本规范。字符集与排序规则(Collation)密切相关,但它们的作用不同。字符集负责处理字符的存储和传输,而排序规则则定义了字符的比较和排序方式。

    MySQL5.7支持的字符集和字符集默认的排序规则,可以参考MySQL5.7的官方文档学习,支持41种字符集:MySQL :: MySQL 5.7 Reference Manual :: 10.2 Character Sets and Collations in MySQL

    MySQL8.0支持的排序规则,达272个之多,详细可以参考MySQL8.0的官方文档学习:MySQL :: MySQL 5.7 Reference Manual :: 10.2 Character Sets and Collations in MySQL

    那么下面梳理一下排序规则的重要知识点:

                      

一、字符集的作用:
1、字符的存储和编码:字符集决定了字符如何转换成字节序列进行存储。不同的字符集采用不同的编码方式来表示字符。例如:

  • UTF-8:将字符映射到1到4个字节之间。它支持全球绝大多数语言,并且是网络传输中常用的编码。
  • Latin1(ISO-8859-1):每个字符用1个字节表示,通常用于西欧语言。
  • UTF-16:通常使用2个字节或4个字节来表示字符,适合用于表示亚洲字符集。

2、支持不同语言和符号:

  • 字符集允许数据库支持多种语言的字符。例如,UTF-8字符集可以存储几乎所有语言的字符,包括汉字、阿拉伯字母、日文字符等。
  • 选择合适的字符集对于支持多语言的应用程序至关重要。

3、数据存储和读取的一致性:

  • 字符集确保数据在存储和读取时的一致性。如果数据库和应用程序使用不匹配的字符集,可能会导致乱码或数据损坏。

4、跨平台数据交换:

  • 使用标准化字符集(如 UTF-8)有助于不同系统之间的数据交换。这样,无论数据如何迁移,字符都能正确显示。

5、节省存储空间:

  • 不同的字符集在存储上有所不同。比如 latin1 每个字符占用 1 字节,而 utf8 占用的字节数则与字符内容的复杂性有关,可能是 1 到 4 个字节。在存储英文等简单字符时,使用 latin1 可以节省存储空间;但如果有多语言需求,使用 utf8 或 utf8mb4 可以更好地支持国际化。

        

二、常见的字符集:

  • latin1(ISO-8859-1):这是最常见的西欧语言字符集之一,每个字符占用 1 个字节。适合处理简单的西欧语言字符(如英语、西班牙语、法语等)。
  • utf8:这个字符集可以表示全球几乎所有的字符,支持从 1 到 3 字节的编码。对于大多数现代应用,尤其是需要支持多语言的系统,utf8 是非常常用的字符集。
  • utf8mb4:它是 utf8 的超集,支持更多的字符,例如 emoji 表情和某些少数民族的字符。utf8mb4 使用 1 到 4 字节存储字符,能够存储所有 Unicode 字符。
  • utf16:这个字符集使用 2 或 4 个字节表示字符,适用于需要表示大量不同语言字符的情况。
  • gbk 和 gb2312:这些是用于中文字符的字符集,在中文环境中较为常见。gb2312 是较旧的字符集,支持简体中文,而 gbk 是对 gb2312 的扩展,支持更多的中文字符。
  • big5:这个字符集用于繁体中文,主要在台湾和香港地区使用。

            
三、字符集与排序规则的关系
    字符集和排序规则是密切相关的。在 MySQL 中,字符集定义了如何存储和表示字符,而排序规则定义了如何比较和排序字符。每个字符集通常会有一个默认的排序规则。例如:

  • utf8 字符集的默认排序规则是 utf8_general_ci,其中 ci 代表“不区分大小写”。
  • utf8mb4 字符集的默认排序规则是 utf8mb4_general_ci,也是不区分大小写。需要注意MySQL5.7中utf8mb4默认排序规则是 utf8mb4_general_ci,而在MySQL8.0中默认排序规则则成了 utf8mb4_0900_ai_ci。

    可以在创建数据库、表、列时,单独指定字符集和排序规则。排序规则影响的是比较、匹配、排序等操作,而字符集影响的是字符的存储。


                         

                         

字符集的排序规则:

    排序规则(Collation)在 MySQL 中的作用主要是决定如何对字符进行 比较和排序 。并且排序规则与字符集密切相关,但排序规则的重点在于字符的比较方式,尤其是如何在查询中对字符进行排序、查找和匹配。

    MySQL5.7支持的排序规则,达222个之多,详细可以参考MySQL5.7的官方文档学习:

MySQL :: MySQL 5.7 Reference Manual :: 10.10 Supported Character Sets and Collations

    MySQL8.0支持的排序规则,达272个之多,详细可以参考MySQL8.0的官方文档学习:MySQL :: MySQL 8.0 Reference Manual :: 12.10 Supported Character Sets and Collations

    那么下面梳理一下排序规则的重要知识点:

                       

一、排序规则的作用:
1、字符比较:排序规则定义了字符在查询时如何进行比较。对于同一个字符集,不同的排序规则可以影响字符比较的行为,尤其在大小写、重音符号、语言等方面的处理。例如:

  • utf8_general_ci: ci 代表不区分大小写(Case Insensitive),即在比较时,A a 被认为是相等的。
  • utf8_bin: bin 代表二进制比较,即字符的二进制值完全一致才认为相等,这意味着 A a 是不同的字符。

2、字符排序:排序规则定义了字符如何排序。例如,某些语言的字符可能会根据特定的语言规则进行排序,而不是按照字母的顺序排列。例如:

  • utf8_unicode_ci:使用 Unicode 字符集进行排序和比较,遵循 Unicode 排序规则,这通常会考虑语言差异和字符的实际顺序。
  • utf8_general_ci:这是一个比较简单的排序规则,适用于大多数情况下的字符排序,但可能不会考虑所有语言的细微差别。

3、语言和文化敏感性:排序规则会根据特定语言的语法进行排序。例如,德语中的 ß 字符在某些排序规则中可能会与 ss 组合字符视为相等。例如:

  • utf8_spanish_ci:这是西班牙语的排序规则,它会遵循西班牙语的特定排序规则来比较字符。

4、大小写敏感性:排序规则决定了字符比较时是否区分大小写。

  • ci:不区分大小写,例如 a A 被认为相等。
  • cs:区分大小写,例如 a A 被认为不同。

5、重音符号敏感性:一些排序规则区分带有重音符号的字符与没有重音符号的字符,另一些则不区分。

  • ai:不区分重音符号,例如 é e 被认为相等。
  • as:区分重音符号,例如 é e 被认为不同。

                     

二、排序规则的常见类型
1、区分大小写(Case Sensitivity):

  • ci(Case Insensitive,不区分大小写):在比较时, A a 被认为相同。
  • cs(Case Sensitive,区分大小写):在比较时, A a 被认为不同。

2、区分重音符号(Accent Sensitivity):

  • ai(Accent Insensitive,不区分重音符号):在比较时, é e 被认为相同。
  • as(Accent Sensitive,区分重音符号):在比较时, é e 被认为不同。

3、二进制比较:

  • bin(Binary,二进制比较):对字符进行字节级别的比较, A a 被认为不同。

    MySQL5.7(含)之后的版本一般都采用utf8mb4字符集,它是 utf8 的超集,支持更多的字符存储。对于排序规则而言,采用默认的即可,但如果业务表有特殊要求,根据要求设置即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/957494.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WPF2-在xaml为对象的属性赋值

1. AttributeValue方式 1.1. 简单属性赋值1.2. 对象属性赋值 2. 属性标签的方式给属性赋值3. 标签扩展 (Markup Extensions) 3.1. StaticResource3.2. Binding 3.2.1. 普通 Binding3.2.2. ElementName Binding3.2.3. RelativeSource Binding3.2.4. StaticResource Binding (带参…

软考 系统架构设计师系列知识点之面向服务架构设计理论与实践(5)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之面向服务架构设计理论与实践&#xff08;4&#xff09; 所属章节&#xff1a; 第15章. 面向服务架构设计理论与实践 第2节 SOA的发展历史 15.2 SOA的发展历史 15.2.3 SOA的微服务化发展 随着互联网技术的快速发展&a…

ICLR顶会论文学习|DRL-based改进启发式求解方法JSSP

论文名&#xff1a;Deep Reinforcement Learning Guided Improvement Heuristic for Job Shop Scheduling Authors: Cong Zhang, Zhiguang Cao, Wen Song, Yaoxin Wu, Jie Zh… 论文发表致&#xff1a;ICLR 2024 论文链接&#xff1a;https://doi.org/10.48550/arXiv.2211.1…

OpenCV简介、OpenCV安装

OpenCV简介、OpenCV安装 本文目录&#xff1a; 零、时光宝盒 一、OpenCV简介 二、OpenCV图像处理基础知识 三、OpenCV-Python环境安装 2.1、纯python环境下安装OpenCV 2.2、Anaconda管理环境下安装 OpenCV 四、如何用OpenCV 中进行读取展示图像 五、OpenCV读取图像、显…

利用预训练检查点进行序列生成任务

摘要 大型神经模型的无监督预训练最近彻底改变了自然语言处理。通过从公开发布的检查点进行热启动&#xff0c;自然语言处理从业者在多个基准测试中推动了最先进的技术&#xff0c;同时节省了大量的计算时间。到目前为止&#xff0c;重点主要集中在自然语言理解任务上。在本文…

5、原来可以这样理解C语言_数组(5)sizeof 计算数组元素个数

目录 5. sizeof 计算数组元素个数 5. sizeof 计算数组元素个数 在遍历数组的时候&#xff0c;我们经常想知道数组的元素个数&#xff0c;那C语⾔中有办法使⽤程序计算数组元素个数 吗&#xff1f; 答案是有的&#xff0c;可以使⽤sizeof。 sizeof 中C语⾔是⼀个关键字&#xff…

vue中echarts-中国地图,世界地图显示(echarts5.6版本本地导入)

地图去掉南海诸岛右下角的框显示&#xff08;因为显示的不是现在的10段线&#xff09; 资源里面主要是有个改好的中国地图json其他的无所谓&#xff0c;用现有的json也行&#xff0c;主要是为了解决10段线的问题 引入需要注意 import * as echarts from “./echarts”; 目录…

Ubuntu系统更改IP,保姆级教程

原理概述 本篇文章所用工具&#xff1a; Xshell&#xff1a;点击下载 VMware Workstation Pro&#xff1a;点击下载 密钥需要自行搜索所下载的VMware对应版本密钥。 IP 地址 IP 地址&#xff08;Internet Protocol Address&#xff09;是分配给每个连接到计算机网络的设备的…

IO进程----进程

进程 什么是进程 进程和程序的区别 概念&#xff1a; 程序&#xff1a;编译好的可执行文件 存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09; 程序是静态的&#xff0c;没有任何执行的概念 进程&#xff1a;一个独立的可调度的任务 执行一个程序分配资…

使用插件SlideVerify实现滑块验证

作者gitee地址&#xff1a;https://gitee.com/monoplasty/vue-monoplasty-slide-verify 使用步骤&#xff1a; 1、安装插件 npm install --save vue-monoplasty-slide-verify 2、在main.js中进行配置 import SlideVerify from vue-monoplasty-slide-verify; Vue.use(SlideV…

初探——【Linux】程序的翻译与动静态链接

我们所写的C/C程序计算机是看不懂的&#xff0c;它只认识0101这样的机器码。所以我们就需要借助编译器对这些源代码进行翻译&#xff0c;使之成为计算机能够执行的二进制指令。这个过程通常分为几个关键步骤&#xff1a;预处理、编译、汇编和链接。 一.预处理&#xff08;Prep…

亲测有效!如何快速实现 PostgreSQL 数据迁移到 时序数据库TDengine

小T导读&#xff1a;本篇文章是“2024&#xff0c;我想和 TDengine 谈谈”征文活动的优秀投稿之一&#xff0c;作者从数据库运维的角度出发&#xff0c;分享了利用 TDengine Cloud 提供的迁移工具&#xff0c;从 PostgreSQL 数据库到 TDengine 进行数据迁移的完整实践过程。文章…

matlab实现数据极坐标显示

%% % 读取文件数据 filename E:\ProjectWorkspace\866\866data\665hangji.txt;%代码 距离 方位相对正北 时间 地址 横滚角度 TRK importdata(filename); filename1 E:\ProjectWorkspace\866\866data\665dianji.txt;%代码 距离 方位相对正北 时间 地址 横滚角度 PLOT …

Jenkins 启动

废话 这一阵子感觉空虚&#xff0c;心里空捞捞的&#xff0c;总想找点事情做&#xff0c;即使这是一件微小的事情&#xff0c;空余时间除了骑车、打球&#xff0c;偶尔朋友聚会 … 还能干什么呢&#xff1f; 当独自一人时&#xff0c;究竟可以做点什么&#xff0c;填补这空虚…

人工智能之深度学习_[4]-神经网络入门

文章目录 神经网络基础1 神经网络1.1 神经网络概念1.1.1 什么是神经网络1.1.2 如何构建神经网络1.1.3 神经网络内部状态值和激活值 1.2 激活函数1.2.1 网络非线性因素理解1.2.2 常见激活函数1.2.2.1 Sigmoid 激活函数1.2.2.2 Tanh 激活函数1.2.2.3 ReLU 激活函数1.2.2.4 SoftMa…

卸载和安装Git小乌龟、git基本命令

卸载 Git 打开控制面板&#xff1a; 按 Win R 打开运行对话框&#xff0c;输入 control 并按回车键。或直接在功能搜索里搜索“控制面板”。在控制面板中&#xff0c;选择“程序”或“程序和功能”。 查找并卸载 Git&#xff1a; 在程序列表中找到“Git”或“Git for Windows…

群论学习笔记

什么是对称&#xff1f; 对称是一个保持对象结构不变的变换&#xff0c;对称是一个过程&#xff0c;而不是一个具体的事物&#xff0c;伽罗瓦的对称是对方程根的置换&#xff0c;而一个置换就是对一系列事物的重排方式&#xff0c;严格的说&#xff0c;它也并不是这个重排本身…

C语言自定义类型:结构体

结构体简介&#xff1a; c语言里int 、float、double、等等类型来表示一个对象&#xff0c;但有时也有未能表达的对象&#xff0c;比如表示一个人的类型&#xff0c;这个类型里有人的身高、体重、年龄等等&#xff0c;这就需要很多个类型来拼凑&#xff0c;这就很不方便。于是…

【整体介绍】

ODO&#xff1a;汽车总行驶里程 Chime: 例如安全带没系的报警声音 多屏交互就是中控屏的信息会同步到主驾驶的仪表盘上 面试问题&#xff1a;蓝牙电话协议HFP 音乐协议A2DP 三方通话测试的逻辑

线性规划:机器学习中的优化利器

一、线性规划的基本概念 线性规划&#xff08;Linear Programming, LP&#xff09;是运筹学中数学规划的一个重要分支&#xff0c;用于在一组线性不等式的约束条件下&#xff0c;找到线性目标函数的最大值或最小值。其问题可以表述为&#xff1a; 在一组线性约束条件 s.t.&am…