mysql(5.7.17)字符集设置(character_set/collation)

本文详细介绍MySQL中字符集(character set)与校对规则(collation)的查询与配置方法,包括如何通过SQL语句和my.ini文件进行字符集的指定与修改。
0 查看字符集(character_set/collation)
use information_schema;
desc tables;    --一定记住tables表,information_schema中的metadata都可以查到

-- 查看db的默认,DEFAULT_CHARACTER_SET_NAME/DEFAULT_COLLATION_NAME
select * from schemata where schema_name = 'db_name';

-- 查看table的,只有table_collation字段
select * from tables where table_schema = 'db_name' and table_name = 'table_name';

-- 查看column的,CHARACTER_SET_NAME/COLLATION_NAME都要
select * from columns where table_schema = 'db_name' and table_name = 'table_name';
--查看mysql支持的character_set,Default collation是默认的"大小写敏感"
select * from information_schema.character_sets;    
--就是执行了上面的sql
show charset;

查看mysql支持的character_set

/*
查看各character set的collation,以gbk为例
gbk_chinese_ci是"大小写不敏感",ci是case sensitive的缩写
gbk_bin是"大小写敏感",以二进制(binary)存储
*/
select * from information_schema.collations;
show collation;

查看各character set的collation

show variables like 'character_set%';   --查看当前环境的character_set

查看当前环境的character_set

show variables like 'collation%';   --查看当前的collation

查看当前的collation

1 my.ini配置character_set
-- 注意位置,放在[client]和[mysql]都可以,效果相同,以后面的为准。放在[mysqld]下服务不能启动。
default-character-set = utf8

-- 上句设置之后,对应的全局变量改变
character_set_client = utf8
character_set_connection = utf8 
character_set_results = utf8

-- 注意位置,放在[mysqld]下
character-set-server = gbk
collation-server = gbk_bin

-- 上句设置之后,对应的全局变量改变
character_set_database = gbk 
character_set_server = gbk    --默认的create database db时的character_set,其他的含义待测试,可根据字面单词猜想
collation_database = gbk_bin
collation_server = gbk_bin
2 数据库的character_set指定/修改
-- 默认db的character_set和@@character_set_server一致,table和db一致,column和table一致
create database db;


-- defalut可有可无,注意gbk的default collation(上面有)是gbk_chinese_ci(大小写不敏感)
-- 即使collation_database/server都是gbk_bin,创建的db默认仍是gbk_chinese_ci,这里专门指定
create datadbase db character set gbk collate gbk_bin;
create datadbase db default character set gbk collate gbk_bin;  --正确
alter datadbase db character set gbk collate gbk_bin;       --正确

alter datadbase db convert to character set gbk collate gbk_bin;    --错误,不支持convert to
3 table的character_set指定/修改
create table t1(c1 varchar2) character set gbk collate gbk_chinese_ci;
-- 测试
insert into t1 values('a');
select * from t1 where c1 = 'A';    --返回'a',此时'a'='A'

--注意以下两种方法的差别,第1句是只是修改默认
alter table t1 character set gbk collate gbk_bin;   --提示Records: 0

--测试
alter table t1 add c2 varchar(50);
insert into t1 values('b','b');
select * from t1 where c1 = 'A';    --返回'a',c1仍然是gbk_chinese_ci
select * from t1 where c2 = 'B';    --返回empty,c2是gbk_bin

--已有字段c1,c2及再添加的默认都是gbk_bin
alter table t1 convert to character set gbk collate gbk_bin;    --提示Records: 1
4 column的character_set指定/修改
-- 套路相同
alter table add c1 varchar(50) character set gbk collate gbk_bin;
alter table t1 change c1 c1 varchar(50) character set gbk collate gbk_bin;
<think>首先,用户的问题是关于MySQLcharacter_set_system字符集,它是只读的,用户想知道如何修改字符集设置。从系统指令中,我需要遵循规则:使用$...$格式的行内数学表达式,$$...$$格式的独立公式,正确LaTeX语法,中文回答,生成相关问题,并在引用末尾添加引用标识。 用户提供了参考引用,我需要参考这些内容。引用[1]讨论了MySQL字符集设置,包括在配置文件中添加代码来设置默认字符集。引用[2]总结了字符集设置,指出改变默认字符集不会影响现有数据库和表。引用[3]提到了SHOW VARIABLES命令来查看字符集相关变量。 关键点是character_set_system是只读的。根据MySQL文档,character_set_system是系统字符集,用于元数据存储,通常是utf8或utf8mb4,并且不能直接修改,因为它是硬编码的。 我的回答应该: - 解释为什么character_set_system是只读的。 - 提供如何影响字符集设置的建议,比如修改其他相关变量。 - 使用中文。 - 结构清晰,逐步解决问题。 - 在引用末尾添加引用标识。 - 生成相关问题。 回答结构: 1. **介绍问题**:解释character_set_system的作用和为什么它是只读的。 2. **解决方法**:建议修改其他字符集变量,如character_set_server、character_set_database等,通过配置文件或SQL命令。 3. **示例**:给出如何修改配置文件的示例。 4. **引用**:自然地添加引用标识到相关部分。 5. **生成相关问题**:在末尾添加相关问题。 引用标识的使用: - 引用[1]讨论了在my.cnf中添加代码来设置字符集。 - 引用[2]解释了改变默认字符集的影响。 - 引用[3]提到了SHOW VARIABLES命令。 在回答中,当提到配置文件修改时,引用引用[1]。当讨论改变字符集的影响时,引用引用[2]。当提到查看变量时,引用引用[3]。 最终,生成相关问题,如: 1. 如何查看MySQL的当前字符集设置? 2. 修改字符集后如何确保数据一致性? 3. 什么是MySQL的元数据字符集? 确保LaTeX正确:由于问题涉及字符集,可能没有数学表达式,但如果有,比如提到编码,使用$...$格式。例如,如果提到UTF-8,就写为UTF-8,不需要LaTeX,除非是数学公式。问题中没有数学内容,所以可能不需要。 回答内容: - 解释character_set_system:它是系统字符集,用于存储数据库对象的名称,如表名、列名。它是只读的,因为MySQL内部使用它,不能更改。 - 建议修改其他设置:如character_set_server、character_set_database、character_set_client等,通过my.cnf文件或SET命令。 - 强调修改这些会影响新创建的数据库和表,但现有对象需要手动更改。 - 给出步骤:编辑配置文件,重启MySQL;或使用ALTER命令。 - 提醒用户修改字符集可能带来的问题,如数据损坏。 生成相关问题: 1. MySQLcharacter_set_system为什么是只读的? 2. 如何正确修改MySQL的默认字符集? 3. 修改字符集后如何转换现有数据?</think>### MySQL character_set_system 字符集修改问题解析 用户提到 MySQL 的 `character_set_system` 是只读属性,无法直接修改。这是一个常见问题,因为 `character_set_system` 是 MySQL 内部用于存储元数据(如数据库名、表名、列名)的系统级字符集,通常固定为 `utf8` 或 `utf8mb4`。其只读性是由 MySQL 的设计决定的:修改它可能导致元数据不一致或系统崩溃[^2]。不过,用户可以通过调整其他相关字符集设置来间接影响整体字符集行为。下面我将逐步解释原因并提供可行的解决方案。 #### 为什么 character_set_system 是只读的? - **系统级依赖**:`character_set_system` 负责元数据的存储和解析,MySQL 在启动时根据编译选项硬编码此值(通常为 `utf8`),运行时无法更改,以避免破坏系统表结构[^2]。 - **只读属性验证**:通过 SQL 命令查看: ```sql SHOW VARIABLES LIKE 'character_set_system'; ``` 输出会显示其值(如 `utf8`),但尝试修改会报错: ```sql SET GLOBAL character_set_system = 'utf8mb4'; -- 错误:Variable is read-only ``` 这确认了其只读性[^3]。 #### 如何修改 MySQL 字符集设置? 虽然无法直接修改 `character_set_system`,但可以通过以下方法调整其他字符集变量,影响新数据库和表的默认编码。这些修改基于引用[1]和引用[2]的建议: 1. **修改配置文件(持久生效)** 编辑 MySQL 配置文件(如 `my.cnf` 或 `my.ini`),在 `[mysqld]` 和 `[client]` 部分添加字符集设置: ```ini [client] default-character-set = utf8mb4 # 设置客户端字符集[^1] [mysqld] character-set-server = utf8mb4 # 设置服务器默认字符集[^1] collation-server = utf8mb4_unicode_ci ``` - **作用**:`character_set_server` 控制新数据库的默认字符集。修改后重启 MySQL 服务,新创建的数据库将继承此设置[^2]。 - **注意**:现有数据库和表不受影响,需手动转换(见步骤3)[^2]。 2. **运行时动态修改(临时生效)** 使用 SQL 命令调整会话或全局变量: ```sql -- 设置服务器默认字符集(影响新数据库) SET GLOBAL character_set_server = 'utf8mb4'; -- 设置客户端字符集(如 character_set_client) SET GLOBAL character_set_client = 'utf8mb4'; -- 设置当前数据库字符集 ALTER DATABASE 数据库名 DEFAULT CHARACTER SET utf8mb4; ``` - **验证修改**: ```sql SHOW VARIABLES LIKE 'character_set_%'; # 查看所有字符集变量[^3] ``` - **限制**:动态修改仅对后续操作生效,重启后失效;需结合配置文件持久化[^1]。 3. **转换现有数据库和表** 若需修改已有数据的字符集,手动执行 `ALTER` 命令: ```sql -- 修改数据库字符集 ALTER DATABASE 数据库名 DEFAULT CHARACTER SET utf8mb4; -- 修改表字符集 ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` - **风险提示**:转换前务必备份数据,避免乱码或数据丢失[^2]。 #### 关键注意事项 - **继承规则**:新表继承数据库的字符集,新数据库继承 `character_set_server` 的设置。修改 `character_set_server` 是最有效的全局调整方式[^2]。 - **兼容性问题**:确保所有字符集设置一致(如 `character_set_client`、`character_set_connection`),否则可能导致乱码[^1]。 - **系统字符集不可变**:即使修改其他设置,`character_set_system` 仍保持为 `utf8`/`utf8mb4`,这是 MySQL 的固有设计[^2]。 通过上述方法,用户可间接控制 MySQL字符集行为,而无需直接操作只读的 `character_set_system`。始终建议在修改前测试配置并备份数据[^1][^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值