MySQL 编码utf8 与 utf8mb4 utf8mb4_unicode_ci 与 utf8mb4_general_ci

MySQL是一个关系型数据库,支持多种字符编码。其中,UTF-8是目前最为常用的字符编码方式之一,但UTF-8也有多种可选的扩展,如utf8mb4,utf8mb4_unicode_ci,以及utf8mb4_general_ci。在使用时需要注意它们之间的区别。

UTF-8 和 UTF-8mb4

UTF-8是Unicode的一种编码方式,适用于1-3个字节的字符编码,但是,UTF-8无法支持4个字节的字符编码,这就导致了它无法存储一些Emoji表情等特殊字符。因此,MySQL提供了一种扩展的字符编码方式:utf8mb4。该编码方式支持4个字节的字符编码,能够存储绝大部分字符。

utf8mb4_general_ci 和 utf8mb4_unicode_ci

在MySQL中,utf8mb4编码方式有两种排序规则:utf8mb4_general_ci和utf8mb4_unicode_ci。这两种排序规则主要区别在于对一些字符的处理方式不同。

utf8mb4_general_ci基于Unicode规则进行排序,但它会忽略字符集的一些细节,比如不区分大小写,不区分一些特殊字符等,它在一定情况下对排序有着较好的性能。utf8mb4_unicode_ci基于Unicode Collation Algorithm来排序,处理方式比utf8mb4_general_ci更加精细,它能够区分不同的大小写,以及一些特殊字符。但由于它需要较多的计算,因此性能不如utf8mb4_general_ci。

配置MySQL使用utf8mb4

以下是配置MySQL使用utf8mb4编码方式的详细过程。

1. 修改MySQL配置文件

需要修改MySQL的配置文件my.cnf(也可能是/etc/mysql/mysql.conf.d/mysqld.cnf)。在该配置文件中找到[mysqld]项,加入以下三行代码:

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-character-set-client-handshake

请注意:该配置是将服务端的默认字符集和排序规则改为utf8mb4和utf8mb4_unicode_ci。但该配置无法修改已有的数据库和表的编码方式,需要进一步修改。

2. 修改已有数据库和表

MySQL中,修改已有的数据库和表的编码方式需要三步:

  1. 重命名要更改编码方式的表或数据库,可以使用ALTER TABLE或RENAME DATABASE语句完成。
  2. 使用CREATE TABLE或CREATE DATABASE语句创建新的表或数据库,其编码方式为utf8mb4。
  3. 将旧表中的数据拷贝至新表中,可以使用INSERT INTO或SELECT INTO语句完成。

下面是两个示例,说明如何配置和使用utf8mb4编码方式

示例1:创建新表使用utf8mb4编码

CREATE TABLE `mytable` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

该示例代码创建了一个名为Mytable的表,该表的字符编码方式为utf8mb4,排序规则为utf8mb4_general_ci。该表包含三个字段:id,name和content。其中name和content的字符集均为utf8mb4,排序规则为utf8mb4_general_ci。

示例2:修改已有的数据库编码方式

假设有一个数据库名为mydb,已有一个名为Mytable的表,需要将该数据库的字符编码方式改为utf8mb4。按照上述三步操作,依次执行以下代码即可完成:

RENAME DATABASE mydb TO mydb_old;
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE mydb;
CREATE TABLE `Mytable` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;
INSERT INTO mydb.`Mytable` SELECT * FROM mydb_old.`Mytable`;

这段代码在修改已有的数据库时,首先将该数据库重命名为mydb_old,然后创建一个新的mydb数据库,该数据库的字符编码方式为utf8mb4,排序规则为utf8mb4_general_ci。随后在新的数据库mydb中创建了一个名为Mytable的表,并将旧表中的数据拷贝至新表中。

以上就是关于MySQL编码utf8、utf8mb4、utf8mb4_general_ci和utf8mb4_unicode_ci的介绍和完整攻略了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL 编码utf8 与 utf8mb4 utf8mb4_unicode_ci 与 utf8mb4_general_ci - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • redis怎么获取所有key

    这篇文章主要介绍“redis怎么获取所有key”,在日常操作中,相信很多人在redis怎么获取所有key问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”redis怎么获取所有key”的疑惑有所帮助!接下来,请跟着小编一起来学习吧! keys:全量遍历键,用来列出所有满足特定正则字符串规则的key,假设redis此时正在生产环境下…

    Redis 2023年4月13日
    00
  • SQL 限定返回行数

    SQL语句中,可以使用LIMIT关键字限定返回的数据行数,这在处理大量数据时非常实用。下面是两个实例,以MySQL为例进行演示。 实例1:返回前N行数据 如果我们想要返回查询结果的前N行数据,可以使用如下的SQL语句: SELECT * FROM table_name LIMIT N; 其中,table_name是需要查询的表名,N是需要返回的行数。 例如,…

    database 2023年3月27日
    00
  • Mysql实现null值排在最前或最后

    最近在做项目迁移,Oracle版本的迁到Mysql版本,遇到有些oracle的函数,mysql并没有,所以就只好想自定义函数或者找到替换函数的方法进行改造。 oracle做数据排序的时候,有时候可以用nulls first或者nulls last将null值排在最前或者最后。oracle方法:null值排在最前 select * from A order b…

    MySQL 2023年4月13日
    00
  • mysql命令行中执行sql的几种方式总结

    以下是mysql命令行中执行sql的几种方式总结的完整攻略: 1. 直接执行SQL语句 在mysql命令行中,可以直接输入SQL语句进行执行。这种方式比较简单快捷,适用于一些简单的SQL语句。示例: mysql> SELECT * FROM users; 2. 从文件中读取SQL语句并执行 如果有一个.sql文件,里面存放了需要执行的SQL语句,可以使…

    database 2023年5月22日
    00
  • MYSQL GTID跳过指定事务

    主库删除了ttt表,从库上没有ttt表,出现了报错。[root@mysqlstu2:demo]10:49:52>show slave status\G*************************** 1. row *************************** Slave_IO_State: Waiting for master to s…

    MySQL 2023年4月13日
    00
  • 数据库系列:覆盖索引和规避回表

    1 介绍 在MySQL数据库查询过程中,索引覆盖和避免不必要的回表,是减少检索步骤,提高执行效率的有效手段。下面从这两个角度分析如何进行MySQL检索提效。 2 数据准备 模拟一个500w数据容量的部门表 emp,表结构如下,并通过工具模拟500w的数据: CREATE TABLE `emp` ( `id` int unsigned NOT NULL AUT…

    2023年4月8日
    00
  • 如何在Python中更新SQLite数据库中的数据?

    以下是在Python中更新SQLite数据库中的数据的完整使用攻略。 更新SQLite数据库中的数据简介 在Python中,可以使用sqlite3模块连接SQLite数据库,并使用UPDATE语句更新数据。更新数据时,需要指要的表、要更新的列和要更新的值,以及更新条件。更新结果可以使用游标对象的rowcount属性获取。 步骤1:导入模块 在Python中,…

    python 2023年5月12日
    00
  • MySQL分库分表与分区的入门指南

    MySQL分库分表与分区的入门指南 什么是MySQL分库分表与分区 MySQL分库分表是将一个大的数据库拆分成多个小型数据库,每个数据库存储不同的数据,以达到提高性能、降低负载的目的。 MySQL分区是将一个表分割成多个分区,每个分区存储不同的数据,以达到提高查询速度、减少磁盘I/O的目的。 MySQL分库分表的实现方式 垂直分库 垂直分库就是将不同的表拆分…

    database 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部