- 设置字符集一般有两种方法,一种是在创建的时候设置字符集
语句 |
说明 |
CREATE DATABASE [db_name] DEFAULT CHARACTER SET = [character set] |
创建数据库时设置字符集 |
CREATE TABLE [tb_name] DEFAULT CHARACTER SET = [character set] |
创建数据表时设置字符集 |
- 另一种是数据表建成之后修改字符集
设置全局字符集
- mysql 中使用SET语句设置全局字符串集
语法
SET character_set_[value] = [character set]
变量名 |
含义 |
character_set_client |
设置客户端使用的字符集。 |
character_set_connection |
设置连接数据库时的字符集,当程序里没指定连接数据库的字符集时的选项。 |
character_set_database |
设置创建数据库时默认字符集,即创建数据库时不指定字符集时的选项。 |
character_set_filesystem |
文件系统的编码格式,把操作系统上的文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的。 |
character_set_results |
数据库给客户端返回时使用的字符集,如果没指定则用character_set_server。 |
character_set_server |
服务器的默认字符集。 |
character_set_system |
数据库系统存储系统元数据的字符集,该值为utf8。 |
character_sets_dir |
字符集安装的目录。 |
在MySQL服务启动时设置字符集
- 可以在MySQL服务启动时,指定server字符集。如不指定,默认的字符集为latin1
mysqld --character-set-server=utf8
设置客户端字符集
- 对MySQL数据库客户端字符集进行设置,对于防止MySQL更新时,出现中文乱码有极大的影响
- 临时生效单条命令法
SET names
utf8;
SET character_set_client
= utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
- 登录数据库时指定字符集
mysql --default-character-set = utf8;
- 通过修改my.cnf实现修改MySQL客户端的字符集
[client]
default-character-set = utf8
注
- 人工登录数据库执行“set names UTF8”,以及使用MySQL命令指定字符集登录操作,或者更改my.cnf配置文件客户端模块的参数,来实现更改客户端字符集,都是改变了MySQL客户端的client、connection、results3个参数的字符集。
修改库的字符集
- 使用 ALTER 语句可以对数据库的字符集进行修改
语法
ALTER DATABASE <数据库名> DEFAULT CHARACTER SET <字符集>;
示例
mysql>ALTER DATABASE test1 DEFAULT CHARACTER SET utf8;
Query OK, 0rows affected (0.58 sec)
注
- 只明确了charset_name,但collation_name未明确,则字符集采用charset_name,字符序采用charset_name对应的默认校验规则。
- 如果库级别没有设置CHARSET和COLLATE,则库级别默认的CHARSET和COLLATE使用实例级别的设置。
- 在mysql8.0以下版本中,你如果什么都不修改,默认的CHARSET是Latin1,默认的COLLATE是latin1_swedish_ci。从mysql8.0开始,默认的CHARSET已经改为了utf8mb4,默认的COLLATE改为了utf8mb4_0900_ai_ci
修改表的字符集
- 使用 ALTER 语句可以对数据表的字符集进行修改
语法
ALTER TABLE <数据表名> CHARACTER SET <字符集>;
示例
mysql>ALTER DATABASE test1 CHARACTER SET utf8;
Query OK, 0rows affected (0.58 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>SHOW CREATE TABLE
test1\G
***************************1. row ***************************
Table: test1
CreateTable: CREATETABLE `test1`
(
`id` int(6) DEFAULT NULL,
`name` char(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET = utf8 #修改后的字符集
1row inset(0.00sec)
注
- 只明确了charset_name,但collation_name未明确,则字符集采用charset_name,字符序采用charset_name对应的默认校验规则。
- charset_name、collation_name均未明确,则采用数据库的字符集、校验规则设置
修改字段的字符集
- 使用 ALTER 语句可以对数据库的字符集进行修改
语法
ALTER TABLE <数据表名> MODIFY NAME CHAR(10) CHARACTER SET <字符集>;
示例
mysql> ALTER TABLE test1 MODIFY NAME CHAR(10) CHARACTER SET gbk;
Query OK, 0 rows affected (0.58 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show full columns from test1;
+-------+-----------+-------------------+-------+-----+----------+--------+-------------------------------------+-----------+
| Field | Type
|
Collation | Null | Key | Default | Extra | Privileges
|
Comment |
+-------+-----------+-------------------+-------+-----+----------+--------+-------------------------------------+-----------+
| id | int(6) | NULL |
YES | | NULL | | select,insert,update,references
| |
| name | char(10) | gbk_chinese_ci | YES | | NULL | | select,insert,update,references
| |
+-------+-----------+-------------------+-------+-----+----------+--------+-------------------------------------+-----------+
2 rows in set (0.01
sec)
注
- 只明确了charset_name,但collation_name未明确,则字符集采用charset_name,字符序采用charset_name对应的默认校验规则。
- charset_name、collation_name均未明确,则采用数据表的字符集、校验规则设置
来自 <https://www.cnblogs.com/yangmingxianshen/p/7999428.html>