mysql字符集如何设置为utf8mb4

388 阅读5分钟

前言

大家好,我是 三味书屋 的作者某亿,今年五一假期旅游实在是太火爆了,看来疫情三年大家都憋坏了,不知道大家是去西安看大唐不夜城了还是去淄博吃烧烤了,我是在淄博上了三年大学都不知道淄博烧烤出名,结果毕业三年后淄博居然火出圈了,言归正传,五一我是哪的票都没买上,只好在家呆着,于是呢,心血来潮开发了一款文章写作平台:coderlibs.com/web/web-boo…

背景

因为是文章写作平台嘛,就像简书、掘金、csdn一样,包括文章和评论,内容自然不只是文字,可能就会涉及到表情等一些特殊字符,也就是在我发布包括表情符号的一些内容的时候,遇到了一个报错:

POPO20230506-124343.jpg

content字段报错原因

这里的 \xf0\x9f... 就是代表我的表情符号,百度得知,这是由于msql字符集的问题,由于表情这种特殊字符是4字节长度的 UTF-8 字符,而我的数据库默认的字符集是UTF8,只能支持存储3字节长度的 UTF-8 字符,所以才会报错。

WeChatbcd5caef3097167ac849d198451d6487.png

MySQL 如何存储表情

MySQL 是一个流行的开源数据库管理系统,是许多网站和应用程序的首选数据库。为了支持更多的字符集和语言,MySQL 5.5.3 版本及以后的版本提供了 UTF8MB4 字符集。

为什么要使用 UTF8MB4 字符集?

UTF8MB4 字符集可以支持更多的 Unicode 字符,包括一些 emoji 表情符号,这些符号在许多应用程序中非常流行。如果您的应用程序需要支持这些字符,所以,我们需要将 MySQL 的字符集设置为 UTF8MB4。

使用什么排序规则呢?

既然我们选择了UTF8MB4 字符集,那么排规则用什么呢?MySQL 支持多种排序规则,以下是一些常见的排序规则:

WeChat5ccec562cc8d91884a189af0da4a2806.png

  • utf8mb4_general_ci: 不区分大小写的排序规则,对于大多数情况都足够。
  • utf8mb4_bin: 区分大小写的排序规则,对于需要精确匹配的情况很有用。
  • utf8mb4_unicode_ci: 基于 Unicode 标准的排序规则,支持更多的语言和字符集。
  • utf8mb4_0900_ai_ci :MySQL 8.0 默认的是 utf8mb4_0900_ai_ci,属于 utf8mb4_unicode_ci 中的一种

根据你的需求自行选择,其实都差不多,这里我们统一选择在比较和排序的时候更快的utf8mb4_general_ci

如何设置 MySQL 的字符集为 UTF8MB4?

以下是一个简单的步骤,帮助您将 MySQL 的字符集设置为 UTF8MB4。

1. 打开 MySQL 的配置文件 my.cnf(linux) 或 my.ini(win)。

您可以在 MySQL 安装目录中找到该文件,没有这个文件的话需要自己创建,参考实例:

```shell
    win:     C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
  linux:     vi /etc/my.cnf  || sudo vi /etc/mysql/my.cnf

```

2. 查找以下行:

```
[mysqld]
```

在该行下面添加以下内容:

```
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
```

3. 完整版实例

```shell
    [client]
    #password       = your_password
    port            = 3306
    socket          = /tmp/mysql.sock
    default-character-set = utf8mb4

    [mysqld]
    port            = 3306
    socket          = /tmp/mysql.sock
    datadir = /www/server/data
    default_storage_engine = InnoDB
    character-set-client-handshake = FALSE
    character-set-server = utf8mb4
    collation-server = utf8mb4_general_ci
    init_connect='SET NAMES utf8mb4 COLLATE utf8mb4_general_ci'

    [mysql]
    no-auto-rehash
    default-character-set = utf8mb4
```

4. 保存并关闭文件。

:wq

5. 关于如何将character_set_database以及collation_database更改为utf8mb4

这实际上不是my.cnf(在本例中为my.ini)中的设置。 mySQL从数据库自己的排序规则中获取此设置(创建时)。为了使此与所需的utf8编码内联,请在mysql中(后面有如何进入mysql的示例)执行以下操作:

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; 这里的databasename也就是我们的数据库名:coderlibs

6. 重启 MySQL 服务器。

如果您在 Windows 上使用 MySQL,您可以使用以下命令重启服务器:

```
net stop mysql
net start mysql
```

如果您在 Linux 上使用 MySQL,您可以使用以下命令重启服务器:

```
sudo service mysql restart
```

测试

接下来我们在linux导入一个utf8mb4表,看看能否导入成功

1.进入mysql

mysql -u coderlibs -p   // coderlibs是我们的用户角色,也可以用root角色进入
Enter password:  // 输入密码
show databases; // 查看数据库列表
use coderlibs; // 使用coderlibs这个数据库

WeChatd282c391d22f932389f7e8c10149966d.png

2. 确认 MySQL 的字符集已经设置为 UTF8MB4。

您可以使用以下命令检查 MySQL 的字符集:

```
SHOW VARIABLES LIKE 'character_set%';
```

如果您看到了以下输出,那么说明 MySQL 的字符集已经设置为 UTF8MB4:

```
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```

导入mysql表

source /www/wwwroot/temp/article.sql;

如果未报错说明导入成功!

查看数据库以及表的字符集

SHOW CREATE DATABASE databasename;
SHOW CREATE TABLE tablename;

WeChat7d15fe7ef4f9d5f56278b89788b94699.png

WeChat584ba1eacf2b701655eafc021b585c75.png 此时,我们可以看到,数据库和新导入的表的字符集都是utf8mb4了,恭喜,可以愉快的保存表情啦!

总结

  • 确定哪些字符集/排序规则可用
SHOW CHARSET;
SHOW COLLATION;
  • 检查字符集
SHOW VARIABLES LIKE '%character%';
SHOW VARIABLES LIKE '%collation%';
  • 设置字符集(在配置文件中-> my.cnf | my.ini)
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
  • 检查数据库/表字符集
SHOW CREATE DATABASE databasename;
SHOW CREATE TABLE tablename;
  • 更改数据库/表字符集:
ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  • 在创建数据库/表时设置:
CREATE DATABASE new_db CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;
CREATE TABLE new_table (id INT) CHARSET utf8mb4 COLLATE utf8mb4_general_ci;

将 MySQL 的字符集设置为 UTF8MB4 是一个简单的过程,但它可以为您的应用程序提供更多的字符集和语言支持。如果您的应用程序需要支持更多的字符集和语言,那么您应该考虑将 MySQL 的字符集设置为 UTF8MB4。