Mysql 字符集配置修改操作

目录

服务器字符集和校对规则

数据库字符集和校对规则

表字符集和校对规则

列字符集和校对规则

[例 1](#例 1)

连接字符集和校对规则


MySQL 服务器可以支持多种字符集,在同一台服务器、同一个数据库甚至同一个表的不同字段中,都可以使用不同的字符集。Oracle 等其它数据库管理系统都只能使用相同的字符集,相比之下,MySQL 明显存在更大的灵活性。

MySQL 的字符集和校对规则有 4 个级别的默认设置,即服务器级、数据库级、表级和字段级。它们分别在不同的地方设置,作用也不相同。

服务器字符集和校对规则

修改服务器默认字符集和校对规则的方法如下。

1)可以在 my.ini 配置文件中设置服务器字符集和校对规则,添加内容如下:

mysqld

character-set-server=字符集名称

2)连接 MySQL 服务器时指定字符集:

mysql --default-character-set=字符集名称 -h 主机IP地址 -u 用户名 -p 密码

如果没有指定服务器字符集,MySQL 会默认使用 latin1 作为服务器字符集。如果只指定了字符集,没有指定校对规则,MySQL 会使用该字符集对应的默认校对规则。如果要使用字符集的非默认校对规则,需要在指定字符集的同时指定校对规则。

可以用 SHOW VARIABLES LIKE 'character_set_server' 和 **SHOW VARIABLES LIKE 'collation_server'**命令查询当前服务器的字符集和校对规则。

复制代码
mysql> SHOW VARIABLES LIKE 'character_set_server';
+----------------------+--------+
| Variable_name        | Value  |
+----------------------+--------+
| character_set_server | gbk    |
+----------------------+--------+
1 row in set, 1 warning (0.01 sec)

mysql> SHOW VARIABLES LIKE 'collation_server';
+------------------+-------------------+
| Variable_name    | Value             |
+------------------+-------------------+
| collation_server | gbk_chinese_ci    |
+------------------+-------------------+
1 row in set, 1 warning (0.01 sec)

数据库字符集和校对规则

数据库的字符集和校对规则在创建数据库时指定,也可以在创建完数据库后通过 ALTER DATABASE 命令进行修改,具体操作可阅读学习《MySQL修改数据库》一节。

需要注意的是,如果数据库里已经存在数据,修改字符集后,已有的数据不会按照新的字符集重新存放,所以不能通过修改数据库的字符集来修改数据的内容。在《MySQL修改字符集步骤详解》一节我们介绍了如何修改已存在数据字符集的方法。

设置数据库字符集的规则如下:

  • 如果指定了字符集和校对规则,则使用指定的字符集和校对规则;
  • 如果指定了字符集没有指定校对规则,则使用指定字符集的默认校对规则;
  • 如果指定了校对规则但未指定字符集,则字符集使用与该校对规则关联的字符集;
  • 如果没有指定字符集和校对规则,则使用服务器字符集和校对规则作为数据库的字符集和校对规则。

为了避免受到默认值的影响,推荐在创建数据库时指定字符集和校对规则。

可以使用 SHOW VARIABLES LIKE 'character_set_database'SHOW VARIABLES LIKE 'collation_database' 命令查看当前数据库的字符集和校对规则。

复制代码
mysql> SHOW VARIABLES LIKE 'character_set_database';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| character_set_database | latin1 |
+------------------------+--------+
1 row in set, 1 warning (0.00 sec)

mysql> SHOW VARIABLES LIKE 'collation_database';
+--------------------+-------------------+
| Variable_name      | Value             |
+--------------------+-------------------+
| collation_database | latin1_swedish_ci |
+--------------------+-------------------+
1 row in set, 1 warning (0.00 sec)

表字符集和校对规则

表的字符集和校对规则在创建表的时候指定,也可以在创建完表后通过 ALTER TABLE 命令进行修改,具体操作可阅读学习《MySQL修改数据表》一节。

同样,如果表中已有记录,修改字符集后,原有的记录不会按照新的字符集重新存放。表的字段仍然使用原来的字符集。

设置表的字符集规则和设置数据库字符集的规则基本类似:

  • 如果指定了字符集和校对规则,使用指定的字符集和校对规则;
  • 如果指定了字符集没有指定校对规则,使用指定字符集的默认校对规则;
  • 如果指定了校对规则但未指定字符集,则字符集使用与该校对规则关联的字符集;
  • 如果没有指定字符集和校对规则,使用数据库字符集和校对规则作为表的字符集和校对规则。

为了避免受到默认值的影响,推荐在创建表的时候指定字符集和校对规则。

可以使用 SHOW CREATE TABLE 命令查看当前表的字符集和校对规则,SQL 语句和运行结果如下:

复制代码
mysql> SHOW CREATE TABLE tb_students_info \G
*************************** 1. row ***************************
       Table: tb_students_info
Create Table: CREATE TABLE `tb_students_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `sex` char(1) DEFAULT NULL,
  `height` float DEFAULT NULL,
  `course_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

列字符集和校对规则

MySQL 可以定义列级别的字符集和校对规则,主要是针对相同表的不同字段需要使用不同字符集的情况。一般遇到这种情况的几率比较小,这只是 MySQL 提供给我们一个灵活设置的手段。

列字符集和校对规则的定义可以在创建表时指定,或者在修改表时调整。语法格式如下:

ALTER TABLE 表名 MODIFY 列名 数据类型 CHARACTER SET 字符集名;

例 1

修改 tb_students_info 表中 name 列的字符集,并查看。SQL 语句和运行结果如下:

复制代码
mysql> ALTER TABLE tb_students_info MODIFY name VARCHAR(10) CHARACTER SET gbk;
Query OK, 11 rows affected (0.11 sec)
Records: 11  Duplicates: 0  Warnings: 0

mysql>  SHOW CREATE TABLE tb_students_info \G
*************************** 1. row ***************************
       Table: tb_students_info
Create Table: CREATE TABLE `tb_students_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) CHARACTER SET gbk DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `sex` char(1) DEFAULT NULL,
  `height` float DEFAULT NULL,
  `course_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

结果显示,name 列字符集修改成功。

如果在创建列的时候没有特别指定字符集和校对规则,默认使用表的字符集和校对规则。

连接字符集和校对规则

上面所讲的 4 种设置方式,确定的都是数据保存的字符集和校对规则。实际应用中,还需要设置客户端和服务器之间交互的字符集和校对规则。

对于客户端和服务器的交互操作,MySQL 提供了 3 个不同的参数:character_set_client、character_set_connection 和 character_set_results,分别代表客户端、连接和返回结果的字符集。通常情况下,这 3 个字符集是相同的,这样可以确保正确读出用户写入的数据,尤其是中文字符。字符集不同时,容易导致写入的记录不能正确读出。

设置客户端和服务器连接的字符集和校对规则有以下几种方法:

1)在 my.ini 配置文件中,设置以下语句:

mysql

default-character-set=gbk

这样服务器启动后,所有连接默认使用 GBK 字符集进行连接。

2)可以通过以下命令来设置连接的字符集和校对规则,这个命令可以同时修改以上 3 个参数(character_set_client、character_set_connection 和 character_set_results)的值。

SET NAMES gbk;

使用这个方法可以"临时一次性地"修改客户端和服务器连接时的字符集为 gbk。

3)MySQL 还提供了下列 MySQL 命令"临时地"修改 MySQL"当前会话的"字符集和校对规则。

set character_set_client = gbk;

set character_set_connection = gbk;

set character_set_database = gbk;

set character_set_results = gbk;

set character_set_server = gbk;

set collation_connection = gbk_chinese_ci;

set collation_database = gbk_chinese_ci;

set collation_server = gbk_chinese_ci;

相关推荐
随身数智备忘录4 小时前
财务数据分析如何与业务场景结合?财务数据分析如何从数出有据到数出有用?
数据库
这个DBA有点耶5 小时前
数据库教程:从零基础到实战的完整学习路径(2026版)
数据库·程序员·代码规范
forestsea6 小时前
从零构建 Java 智能体 RAG 系统:Milvus 向量数据库实战指南
java·数据库·milvus
默 语6 小时前
Java新手入门:从零开始安装JDK并配置环境变量
java·开发语言·python·mysql·group by·1024程序员节·数据去重
probex_6 小时前
从 ByConity 到 VictoriaMetrics:一次指标数据迁移引发的四种存储对比
数据库
用户3074596982077 小时前
MySQL EXPLAIN 零基础完全精通指南:从"看不懂"到"会优化"
mysql
Patrick在香港7 小时前
Python 审计香港开放数据目录:两个端点差 10 倍,只有 9.3% 的资源标了「最后修改时间」
开发语言·数据库·python·数据分析·api·数据治理·开放数据
这个DBA有点耶7 小时前
自增主键用尽了怎么办?INT溢出、在线迁移与预防策略全解析
数据库·mysql·代码规范
迷茫的大专生7 小时前
高可用总结
redis·mysql·nginx·高可用
老纪的技术唠嗑局8 小时前
Agent 习惯性删库跑路,数据库纷纷学 Git 续命
数据库·人工智能