MySQL运维实战(5.2) MySQL charset基本概念

俊达2年前技术文章900

mysql多字符集

mysql支持多字符集。一个数据库中可以存储不同字符集的数据,一个表的不同字段可以使用不同的字符集。


mysql> show character set like '%g%';
+---------+---------------------------------+--------------------+--------+
| Charset | Description                     | Default collation  | Maxlen |
+---------+---------------------------------+--------------------+--------+
| big5    | Big5 Traditional Chinese        | big5_chinese_ci    |      2 |
| gb18030 | China National Standard GB18030 | gb18030_chinese_ci |      4 |
| gb2312  | GB2312 Simplified Chinese       | gb2312_chinese_ci  |      2 |
| gbk     | GBK Simplified Chinese          | gbk_chinese_ci     |      2 |
| geostd8 | GEOSTD8 Georgian                | geostd8_general_ci |      1 |
| greek   | ISO 8859-7 Greek                | greek_general_ci   |      1 |
+---------+---------------------------------+--------------------+--------+
6 rows in set (0.00 sec)



MySQL中,有字符的地方,就有字符集

  • MySQL字符类型的字段(varchar,char,text),都有对应的字符集。

  • MySQL元数据(如表名、字段名、表和字段的注释、存储过程代码)


字符集参数

MySQL中有一系列字符集相关的参数,可以通过命令查看:


mysql> show variables like '%char%';
+--------------------------+------------------------------------------------------+
| Variable_name            | Value                                                |
+--------------------------+------------------------------------------------------+
| character_set_client     | utf8mb3                                              |
| character_set_connection | utf8mb3                                              |
| character_set_database   | big5                                                 |
| character_set_filesystem | binary                                               |
| character_set_results    | utf8mb3                                              |
| character_set_server     | utf8mb4                                              |
| character_set_system     | utf8mb3


参数

含义

character_set_system

系统字符集,都是utf8,用来存储元数据(字段名、表名、comment、存储过程代码等)

character_set_server

mysql服务器字符集

character_set_client

客户端数据编码

character_set_connection


character_set_results

服务端返回给客户端的数据(如字段名、数据、错误信息)的编码

character_set_filesystem

文件名编码。使用load data, select into outfile时文件名的编码

character_set_database

数据库默认编码。



建表时不指定字符集

如果建表时不指定表或字段的字符集,mysql如何确定他们的字符集?

1、建库时,如果不指定库的默认字符集,则库的默认字符集设置为character_set_server。

mysql> show variables like '%character_set_server%';
+----------------------+--------+
| Variable_name        | Value  |
+----------------------+--------+
| character_set_server | latin1 |
+----------------------+--------+
1 row in set (0.00 sec)

mysql> create database db_latin;
Query OK, 1 row affected (0.00 sec)

mysql> show create database db_latin;
+----------+--------------------------------------------------------------------------------------------------------+
| Database | Create Database                                                                                        |
+----------+--------------------------------------------------------------------------------------------------------+
| db_latin | CREATE DATABASE `db_latin` /*!40100 DEFAULT CHARACTER SET latin1 */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+--------------------------------------------------------------------------------------------------------+



2、建表时,如果不指定表的字符集,则表的字符集设置为所在数据库的默认字符集。

mysql> create database db_utf8 default character set utf8;
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> create database db_gbk default character set gbk;
Query OK, 1 row affected (0.00 sec)


mysql> create table db_utf8.t(a varchar(100));
Query OK, 0 rows affected (0.00 sec)

mysql> create table db_gbk.t(a varchar(100));
Query OK, 0 rows affected (0.00 sec)

mysql> show create table db_utf8.t\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `a` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
1 row in set (0.01 sec)

mysql> show create table db_gbk.t\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `a` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1 row in set (0.00 sec)


3、建表时,如果不指定字段的字符集,则字段的字符集设置为表的默认字符集。


4、如果显式指定字段的字符集,则以指定的字符集为准

mysql> alter table db_gbk.t add c1 varchar(10), add  c2 varchar(10) character set utf8mb4;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0


mysql> show create table db_gbk.t\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `a` varchar(100) DEFAULT NULL,
  `c1` varchar(10) DEFAULT NULL,
  `c2` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1 row in set (0.00 sec)



一般情况下,我们建议:

1、建表时显式指定表的字符集。

2、同一个表的多个字段,使用同样的字符集。不混合使用多个字符集。

3、一个库的多个表,使用同样的字符集。

混合使用不同的字符集可能会导致一些问题:

1、容易产生乱码。

2、表关联时发生隐式类型转换,影响查询性能。







相关文章

MySQL运维实战之备份和恢复(8.9)xtrabackup备份指定表

备份部分表如果实例设置了参数innodb_file_per_table,xtrabackup可以备份部分表。通过--tables,--tables-file,--databases,--databas...

MySQL运维实战之ProxySQL(9.3)使用ProxySQL实现读写分离

proxysql读写分离主要通过mysql_query_rules表中的规则来实现。下面是具体的配置步骤:hostgroup配置insert into mysql_servers&...

MySQL运维实战(4.3) SQL_MODE之ONLY_FULL_GROUP_BY

设置ONLY_FULL_GROUP_BY后,对有group by子句SQL,select的字段要么是group by中的字段,要么对字段进行聚合运算,否则sql执行报错。不设置ONLY_FULL_GR...

MySQL运维实战(2.1) 登录失败次数太多导致主机被block的问题处理

参数max_connect_errorsMySQL有参数max_connect_errors,当一个主机尝试登录MySQL,失败的次数超过了max_connect_errors,则这个主机将无法登录到...

MySQL运维实战(4.1) MySQL表存储引擎

MySQL表的特点和其他数据库如Oracle、SQL Server相比,mysql有一些特点:MySQL使用插件式存储引擎,同一个数据库中的表可以使用不同的存储引擎。存储引擎决定了表的物理存储格式。表...

MySQL运维实战(5.3) MySQL数据乱码的一些情况

MySQL运维实战(5.3) MySQL数据乱码的一些情况

表数据乱码当数据的真实编码和相关参数(常见的包括character_set_client, character_set_result, 字段的编码,终端的编码)不一致时,会产生乱码。测试1 - 表中的...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。