mysql设置字符集utf8mb4

为什么要把数据库的字符集设置成utf8mb4呢?以前一直用的都是utf8啊?
答案在这里:utf8适用于不使用移动设备的互联网交互,utf8mb4适用于当前的移动设备互联网开发,因为移动设备中常常会有表情符号(emoji)的存储,它占用4个字节的存储空间,而utf8是3个字节,这样,用3个字节去存储4个字节的东西,很明显是存不下的,会报错,所以要用utf8mb4,并且utf8mb4是兼容utf8的,那么,就没有理由不用utf8mb4字符集了。

介绍设置mysql的字符集:
1 在ubuntu安装mysql (密码自己设置)

sudo apt-get install mysql-server
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev

2 进入mysql,查看信息

zhangl@zhangl:~$ mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.12-0ubuntu1 (Ubuntu)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+-------------------+
| Variable_name            | Value             |
+--------------------------+-------------------+
| character_set_client     | utf8              |
| character_set_connection | utf8              |
| character_set_database   | latin1            |
| character_set_filesystem | binary            |
| character_set_results    | utf8              |
| character_set_server     | latin1            |
| character_set_system     | utf8              |
| collation_connection     | utf8_general_ci   |
| collation_database       | latin1_swedish_ci |
| collation_server         | latin1_swedish_ci |
+--------------------------+-------------------+
10 rows in set (0.02 sec)

可以看到我的mysql版本是5.7的,utf8mb4有一个使用限制,mysql版本必须是5.5以上,大家需要注意,我目前用的ubuntu系统是16.04的。当前mysql的字符集配置如上表,我们的目的是更改成utf8mb4。

3 找到mysql的配置文件,可用命令

sudo find / -name my.cnf

我的配置文件位置如下,个别的位置有所不同
/etc/mysql/mysql.conf.d/mysqld.cnf

4 修改配置文件
在原文中添加以下内容:

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

原文件中无“[client]”和“[mysql]”,需要手动添加上。

......
# Here is entries for some specific programs
# The following values assume you have at least 32M ram

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld_safe]
socket      = /var/run/mysqld/mysqld.sock
nice        = 0

[mysqld]
#
# * Basic Settings
#
user        = mysql
pid-file    = /var/run/mysqld/mysqld.pid
socket      = /var/run/mysqld/mysqld.sock
port        = 3306
basedir     = /usr
datadir     = /var/lib/mysql
tmpdir      = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking

character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
#
# Instead of skip-networking the default is now to listen only on
......

5 重启mysql服务

sudo service mysql restart

6 查看结果

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    3
Current database: *** NONE ***

+--------------------------+--------------------+
| 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               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+
10 rows in set (0.00 sec)

ok了,这就是我想要的结果,现象可以去连项目测试了。

<think>我们正在讨论将MySQL的所有字符集设置utf8mb4的必要性和方法。根据引用,我们知道utf8mb4支持完整的Unicode字符,包括表情符号和某些特殊字符(4字节字符),而传统的utf8只支持最多3字节的字符。因此,为了确保数据的完整性和避免乱码问题,将MySQL字符集统一设置utf8mb4是非常必要的。 根据引用[1],我们可以通过修改配置文件(my.ini或my.cnf)来设置字符集。引用[2]和[5]提供了配置文件的示例设置。同时,引用[3]提到了在应用程序中设置字符集的方法,引用[4]则展示了如何修改已有表的字符集。 下面我将详细说明配置步骤和注意事项。 ### 必要性 1. **支持完整的Unicode字符**:utf8mb4支持4字节的Unicode字符(如表情符号),而utf8不支持,这会导致存储4字节字符时出现数据丢失或错误。 2. **避免乱码**:统一字符集可以确保数据在客户端、连接和服务器之间传输时不会出现乱码。 3. **兼容性**:随着应用的发展,使用表情符号等特殊字符的需求越来越普遍,使用utf8mb4可以更好地适应未来需求。 ### 配置方法 #### 步骤1:修改配置文件 在MySQL的配置文件(Linux下通常是`/etc/my.cnf`或`/etc/mysql/my.cnf`,Windows下是`my.ini`)中添加以下配置: ```ini [client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect = 'SET NAMES utf8mb4' ``` **注意**: - `character-set-client-handshake = FALSE`:强制客户端使用服务器端设置字符集,忽略客户端的设置(引用[2][5])。 - `init_connect`:每个客户端连接建立时执行的SQL语句,这里设置连接字符集utf8mb4(引用[2])。 #### 步骤2:重启MySQL服务 修改配置文件后,需要重启MySQL服务使配置生效。 - Linux: ```bash sudo systemctl restart mysql # 或 mysqld ``` - Windows: 通过服务管理器重启MySQL服务。 #### 步骤3:验证字符集设置 登录MySQL,执行以下命令查看字符集设置: ```sql SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; ``` 预期结果: - `character_set_client`、`character_set_connection`、`character_set_results` 应为 `utf8mb4` - `character_set_server` 应为 `utf8mb4` - `collation_server` 应为 `utf8mb4_unicode_ci` #### 步骤4:修改现有数据库和表的字符集 对于已有的数据库和表,需要手动修改字符集(引用[4])。 1. 修改数据库的字符集: ```sql ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; ``` 2. 修改表的字符集(以表`table_name`为例): ```sql ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 3. 修改列的字符集(如果需要单独修改某列): ```sql ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` **注意**:修改大表的字符集可能会锁表,请在业务低峰期操作。 ### 注意事项 1. **索引长度问题**:由于utf8mb4使用4个字节表示一个字符,而utf8使用3个字节,因此索引的最大长度会受到影响。InnoDB引擎中,索引最大长度为767字节(在MySQL5.7之前)或3072字节(MySQL5.7及以后)。使用utf8mb4时,一个字符占4字节,所以索引列的最大字符数会减少。例如,对于VARCHAR(255)的列,如果使用utf8mb4,索引长度可能达到255*4=1020字节,超过767字节,此时需要减小列的长度或使用前缀索引。 2. **应用程序连接设置**:在应用程序中,连接数据库后应执行`SET NAMES 'utf8mb4'`(或使用引用[3]中提到的API设置)。例如,在PHP中,可以使用`mysqli_set_charset($conn, "utf8mb4")`。 3. **MySQL版本**:确保MySQL版本在5.5.3及以上(推荐5.6或更高版本),因为utf8mb4是在5.5.3版本引入的。 4. **检查字符集支持**:在配置之前,可以检查MySQL是否支持utf8mb4: ```sql SHOW CHARACTER SET LIKE 'utf8mb4'; ``` ### 结论 **完全有必要将所有字符集设置utf8mb4**,特别是需要存储表情符号或其他4字节字符的应用场景。通过修改配置文件并重启服务,然后转换现有数据库和表的字符集,可以完成设置。同时,注意索引长度限制和应用程序中的连接设置。 §§相关问题§§ 1. 如何检查MySQL是否支持`utf8mb4`字符集? 2. 将现有数据库从`utf8`迁移到`utf8mb4`的具体步骤是什么? 3. MySQL中`character_set_client`和`character_set_connection`有什么区别? 4. 为什么即使设置了`utf8mb4`仍然出现表情符号存储失败的问题?</think>### MySQL 所有字符集配置为 utf8mb4 的必要性与配置指南 #### ✅ **必要性分析** 1. **完整 Unicode 支持** - `utf8mb4` 支持 4 字节字符(如表情符号 🤖、生僻汉字 𠀋),而传统 `utf8` 仅支持 3 字节字符,存储 4 字节字符会导致**数据截断**或插入错误[^1][^4] - 示例:存储 `"Hello😊"` 时,`utf8` 会变成 `"Hello?"`,`utf8mb4` 可完整保存 2. **数据一致性保障** - 当 `character_set_client`(客户端) 与 `character_set_server`(服务器) 不一致时,会出现**乱码**或转换错误[^1] - 统一为 `utf8mb4` 可避免编码转换过程中的数据损失 3. **现代应用需求** - 移动应用、社交媒体等场景普遍使用表情符号 - 国际业务需支持多语言字符(如中日韩生僻字、阿拉伯语变体) #### ⚙️ **完整配置步骤** **1. 修改配置文件** 在 `my.cnf` (Linux) 或 `my.ini` (Windows) 中添加: ```ini [client] default-character-set = utf8mb4 # 控制客户端字符集[^2][^5] [mysql] default-character-set = utf8mb4 # MySQL 命令行工具字符集 [mysqld] character-set-client-handshake = FALSE # 强制使用服务器设置[^2][^5] character-set-server = utf8mb4 # 服务器默认字符集[^1][^2] collation-server = utf8mb4_unicode_ci # 默认排序规则 init_connect = 'SET NAMES utf8mb4' # 连接初始化命令[^2] ``` **2. 重启 MySQL 服务** ```bash # Linux sudo systemctl restart mysql # Windows net stop mysql && net start mysql ``` **3. 验证全局设置** 执行 SQL 检查: ```sql SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; ``` 预期输出: | 变量名 | 值 | |-------------------------|---------------------| | `character_set_client` | `utf8mb4` | | `character_set_server` | `utf8mb4` | | `collation_connection` | `utf8mb4_unicode_ci`| **4. 转换现有数据库** ```sql -- 修改数据库 ALTER DATABASE `your_db` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; -- 修改表 (示例) ALTER TABLE `your_table` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; [^4] ``` **5. 应用程序适配** 在代码中显式声明字符集: ```php // PHP 示例 $conn = new mysqli($host, $user, $pass, $db); $conn->set_charset("utf8mb4"); // 关键步骤[^3] ``` #### ⚠️ **关键注意事项** 1. **索引长度限制** - `utf8mb4` 的字符占用 4 字节,可能触发索引长度限制(最大 767 字节) - 解决方案: ```sql ALTER TABLE `table` MODIFY `column` VARCHAR(191) -- 原为 VARCHAR(255) CHARACTER SET utf8mb4; ``` 2. **连接级覆盖** 即使服务器配置正确,应用程序仍可能覆盖设置: - Java 需在 JDBC URL 添加:`?useUnicode=true&characterEncoding=UTF-8` - Python 需执行:`cursor.execute("SET NAMES utf8mb4")` 3. **版本兼容性** - MySQL ≥ 5.5.3 才支持 `utf8mb4`[^4] - 检查支持性: ```sql SHOW CHARACTER SET LIKE 'utf8mb4'; -- 必须有返回结果 ``` #### 🔧 **故障排查** **问题**:配置后仍出现乱码 **解决方案**: 1. 检查连接级设置: ```sql SELECT * FROM performance_schema.session_variables WHERE VARIABLE_NAME IN ( 'character_set_client', 'character_set_connection', 'character_set_results' ); ``` 2. 确保应用层未覆盖配置(如 PHP 的 `mysqli::set_charset()`) 3. 验证数据存储是否已转换: ```sql SELECT CHARSET(column) FROM table LIMIT 1; ``` > **终极验证**:插入表情符号测试 `INSERT INTO test VALUES ('😊')`,若成功则配置正确。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值