MySQL数据库【字符集】
8.1 什么是字符集\字符编码
字符集其实就是一套文字符号及编码,通过对应的文字及编码,
就可以将人类可以识别的内容与计算机可以识别的信息进行互相转换。
8.2 校对规则
作用是定义比较字符串的方式
校对规则是一套规则,作用是对编码进行比较
8.3 计算机数据传输原理
大家都知道计算机里面存储的是一堆01组成的二进制代码,那么计算机是怎样把这些数字信号传输出去的呢?
计算机只有一根网线是和外界相连的,而和网线连接的地方叫做网卡,而网卡的作用就是把计算机的数字信号转换成光电信号发送出去.要想知道计算机是如何传输数据的首先要了解的是网卡的工作原理。
计算机生成的数据包只是存放在内存中的一串数字信息,没有办法直接发送给对方。因此,我们要将数字信息转换为电或者光信号,才能在网线或者光纤上传输。
负责这个转换工作的设备叫网卡,但是网卡是无法单独工作的,要控制网卡还需要网卡驱动程序,想必大家新买的电脑第一件事肯定是装系统,然后是装驱动,这里的驱动就包含了网卡,显卡,键盘,鼠标的驱动等。如果没有网卡驱动,网卡是工作不了的,也就是上不了网了,同样没有显卡启动,你的电脑也就显示不了东西。
不同厂商的网卡在结构上有所不同,因此网卡的驱动程序也是由各大网卡厂商开发的专门的应用程序。
网卡的内部结构如下图:
![]()
网卡并不是通电后就开始工作的,而是和其他硬件一样需要初始化,计算机启动操作系统后,网卡驱动程序会对硬件进行初始化,然后网卡才能进入工作状态。
网卡的内部存储着全世界唯一的地址叫做MAC地址,这是在生产网卡的时候写入的,这个地址不能被修改,因为它是写在ROM当中的,ROM是只读存储器,但是可以在Windows系统里面被模拟修改成其他MAC地址。
网卡中的保存的MAC地址会由网卡驱动程序读取并分配给MAC模块,网卡驱动从IP模块获取数据包后,会将其复制到网卡内的缓冲区中,然后MAC模块会将数据包从缓冲区取出,并在开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验系列如下图:
![]()
报头是一串像10101010…这样 1 和 0 交替出现的比特序列,长度为 56 比特,它的作用是确定包的读取时机。
当这些 1010 的比特序列被转换成电信号后,会形成如下图这样的波形。接收方在收到信号时,遇到这样的波形就可以判断读取数据的时机。
![]()
用电信号来表达数字信息时,我们需要让 0 和 1 两种比特分别对应特定的电压和电流,例如下图这样的电信号就可以表达数字信息。
![]()
通过电信号来读取数据的过程就是将这种对应关系颠倒过来。也就是说,通过测量信号中的电压和电流变化,还原出 0 和 1 两种比特的值。
加上一系列报头等数据之后,我们就可以将数据包通过网线发送出去了,发送信号的操作分为2种,一种是使用集线器的半双工模式,另一种是使用交换机的全双工模式。
什么是半双工?什么是全双工?半双工就是同一时间只能一方发送一方接收。而全双工,收发双方可以同时发送数据。
![]()
然后MAC 模块从报头开始将数字信息按每个比特转换成电信号,由 PHY, 或者叫 MAU 的信号收发模块发送出去。在这里,将数字信息转换为电信的速率就是网络的传输速率,例如每秒将 10 Mbit 的数字信息转换为电信号发送出去,则速率就是 10 Mbit/s。
接下来,PHY(MAU)模块会将信号转换为可在网线上传输的格式, 并通过网线发送出去。
以太网规格中对不同的网线类型和速率以及其对应的信号格式进行了规定,但 MAC 模块并不关心这些区别,而是将可转换为任意格式的通用信号发送给 PHY(MAU)模块,然后 PHY(MAU)模块再将其转换为可在网线上传输的格式。
8.4常用字符集介绍与选择建议
1.常用字符集介绍
字符集 描述 校对规则 字节
| 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 | *20年前
| utf8 | UTF-8 Unicode | utf8_general_ci |3 | *上一代主流,不用了。
| utf8mb4 | UTF-8 Unicode | utf8mb4_0900_ai_ci |4 | *主流,8.0默认
| latin1 | cp1252 West European | latin1_swedish_ci |1 |
面试;请介绍下常用字符集有哪些?utf8和utf8mb4区别?
utf8和utf8mb4区别?
1.utf8一个汉字三个字节,utf8mb4一个汉字四个字节,
2.utf8其实就是utf8mb3,被utf8mb4包含。
2.MySQL如何选择合适的字符集
使用utf8mb4字符集
3.查看MySQL数据库字符集和校对规则
show charset;
4.建库显示指定字符集和校对规则
8.0以前建库需要指定字符集和校对规则
8.0以后可以不用
5.查看数据库当前字符集
mysql> show variables like '%character_set%';
+--------------------------+----------------------------------+
| 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 | utf8mb3 |
| character_sets_dir | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
6.MySQL数据库字符集配置
1)操作系统级别。
[root@oldboy ~]# cat /etc/locale.conf #<==配置到配置文件里可以永久生效。
LANG="zh_CN.UTF-8"
[root@oldboy ~]# . /etc/locale.conf
[root@oldboy ~]# echo $LANG
zh_CN.UTF-8
2)操作系统客户端级别(xshell)。
utf8
3)MySQL实例级别。
方法1:编译指定。
方法2:配置文件*****
[mysqld]
character-set-server=utf8
方法3:启动时
mysqld --character-set-server=utf8
影响:
| character_set_database | utf8mb4 |
| character_set_server | utf8mb4
4)数据库中的库级别。
CREATE DATABASE `oldboy` CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
默认继承实例字符集.
5)表级别(含字段级别)。
CREATE TABLE `stu` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '学号',
`sname` varchar(64) NOT NULL COMMENT '姓名',
`age` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '年龄',
`gender` enum('M','F','N') NOT NULL DEFAULT 'N' COMMENT '性别',
`telnum` char(15) NOT NULL DEFAULT '0' COMMENT '手机号',
`state` tinyint NOT NULL DEFAULT '1' COMMENT '状态:1为存在,0为不存在',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=112 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生表'
6)MySQL客户端级别(连接及返回结果)。
方法1:mysql> set names gbk;
方法2:配置文件
[client]
default-character-set=utf8
客户端影响客户端\连接\返回结果:
character_set_client | utf8mb4
character_set_connection | utf8mb4
character_set_results | utf8mb4
7)程序代码级别。
wordpress jpress,bbs
连接文件里指定字符编码
/** Database charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8mb4' );
/** The database collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );
php文件显示中文乱码的解决办法:
1、在PHP文件的最上面加入header语句;
<?php
header("content-type:text/html;charset=utf-8"); //设置编码
?>
2、在HTML页面的开始处加入utf-8编码;
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
3、PHP+Mysql中文乱码问题
<?php
mysql_query('SET NAMES UTF8');
//接下来的就是查出数据或者修改,增加
?>
汉语不乱码:以上字符集都要注意
查看方法:
mysql> show variables like 'character_set%';
+--------------------------+----------------------------------------------------------+
| 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 | utf8mb3 |
| character_sets_dir | /opt/mysql-8.0.26-linux-glibc2.12-x86_64/share/charsets/ |
+--------------------------+----------------------------------------------------------+
7、mysql连接,如何防止数据库的中文显示乱码
show variables like 'character_set%';
结果中以下五个一致:
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4
8.5 如何更改MySQL数据库库表的字符集
8.5.1 更改库的字符集
alter database oldboy CHARACTER SET utf8 collate utf8_general_ci;
8.5.2 更改表的字符集
alter table t1 CHARACTER SET latin1;
注意:以上方法更改只对新数据有效.
8.5.3 生产环境更改数据库(含数据)字符集的方法
字符集从小往大改:utf8--->utf8mb4
更改步骤;
1.确保数据库不要更新,然后导出所有数据为SQL文件。
2.针对导出的数据进行字符集替换(替换表和库),例如把gbk改为utf8。
3.修改my.cnf配置文件,更改MySQL客户端及服务端字符集,重启生效。
4.导入更改过新字符集的库表的数据,包括表结构语句,然后提供服务。
5.更改操作系统,SSH客户端,以及程序为对应新字符集。
另外,更改字符集时,要从小的字符集集合更改为大的字符集集合,不然可能丢数据。
整个操作步骤比较简单,这里就不给读者演示了。