MySQL是怎样运⾏的
MySQL是怎样运⾏的
1 初识MySQL
1.1MySQL的C/S架构
根据我以往的经验,MySQL会启动⼀个服务,我们可以通过“客户端”链接到服务,进⾏对数据库的操作。
所以,它的执⾏步骤通常是这样的:
1. 启动MySQL服务器程序
mysql无法连接到服务器2. 启动MySQL客户端程序,连接到服务器程序
3. 在客户端程序输⼊命令语句,并将其作为请求(Http请求)发送给服务器程序。服务器程序在收到这些请求后,根据请求的内
容来操作具体的数据,并将结果返回给客户端。
代表MySQL服务器程序的进程称为MySQL数据库实例
1.1.3 启动
初次启动需要安装,使⽤mysqld --initialize-insecure ,使⽤console选项可以将安装结果打印在控制台上
如果需要安装服务,使⽤mysqld --install即可
2 启动选项和系统变量
2.1 启动选项和配置⽂件
2.1.1 命令⾏启动选项
在命令⾏中指定启动选项的格式如下:
mysqld --skip-networking
其中要注意的是启动选项全称前要使⽤--,单词连接可以使⽤-或者_,且单词和值之间不要有空格
2.1.2 配置⽂件中使⽤选项
mysql程序在启动时会在多个路径下寻配置⽂件,不过我们⼀般只需要在basedir,也就是mysql安装⽬录下防⽌⼀份名为my.ini或者myf的配置⽂件即可
3 字符集和⽐较规则
3.1 字符集介绍
……
3.2 MySQL中⽀持的字符集和⽐较规则
3.2.1 utf8和utf8mb4
由于4字节字符实在不常⽤(emoji等),所以MySQL默认了两个容易混淆的概念:
utf8mb3:精简的UTF-8字符集,只能表⽰1~3字节的字符,在MySQL中,utf-8==utf8mb3
utf8mb4:完整的UTF-8字符集能表⽰1~4字节的字符
所以,如果要在MySQL(版本低于8.0)中存储emoji,要修改MySQL字符集;版本⼤于8.0后,已经对字符集进⾏了优化,可以utf-8得以真
正地等于utf-8,并且作为数据库的默认字符集出现
3.2.2 查看字符集
通过在控制台输⼊show charset即可查看当前⽀持的字符集,可以看到这些字符集都为⼩写形式出现,值得我们注意的就是最后⼀列的Maxlen,即最⼤字符长度
+----------+-----------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
| dec8 | DEC West European | dec8_swedish_ci | 1 |
| cp850 | DOS West European | cp850_general_ci | 1 |
| hp8 | HP West European | hp8_english_ci | 1 |
| koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 |
| latin1 | cp1252 West European | latin1_swedish_ci | 1 |
| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |
| swe7 | 7bit Swedish | swe7_swedish_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
| ujis | EUC-JP Japanese | ujis_japanese_ci | 3 |
| sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 |
| hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 |
| tis620 | TIS620 Thai | tis620_thai_ci | 1 |
| euckr | EUC-KR Korean | euckr_korean_ci | 2 |
| koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 |
| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |
| greek | ISO 8859-7 Greek | greek_general_ci | 1 |
| cp1250 | Windows Central European | cp1250_general_ci | 1 |
| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |
| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |
| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |
| cp866 | DOS Russian | cp866_general_ci | 1 |
| keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 |
| macce | Mac Central European | macce_general_ci | 1 |
| macroman | Mac West European | macroman_general_ci | 1 |
| cp852 | DOS Central European | cp852_general_ci | 1 |
| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |
| cp1251 | Windows Cyrillic | cp1251_general_ci | 1 |
| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |
| utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 |
| cp1256 | Windows Arabic | cp1256_general_ci | 1 |
| cp1257 | Windows Baltic | cp1257_general_ci | 1 |
| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |
| binary | Binary pseudo charset | binary | 1 |
| geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 |
| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 |
| eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 |
+----------+-----------------------------+---------------------+--------+
40 rows in set (0.00 sec)
3.2.3 查看⽐较规则
使⽤show collation命令查看⽐较规则,但所有字符集的⽐较规则太多,我们只查看utf8的,show collation where charset like 'utf8';,结果如下,期中Default为Yes的就是该字符集默认的⽐较规则
+--------------------------+---------+-----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+--------------------------+---------+-----+---------+----------+---------+
| utf8_general_ci | utf8 | 33 | Yes | Yes | 1 |
| utf8_bin | utf8 | 83 | | Yes | 1 |
constant其他形式| utf8_unicode_ci | utf8 | 192 | | Yes | 8 |
| utf8_icelandic_ci | utf8 | 193 | | Yes | 8 |
| utf8_latvian_ci | utf8 | 194 | | Yes | 8 |
| utf8_romanian_ci | utf8 | 195 | | Yes | 8 |
| utf8_slovenian_ci | utf8 | 196 | | Yes | 8 |
| utf8_polish_ci | utf8 | 197 | | Yes | 8 |
| utf8_estonian_ci | utf8 | 198 | | Yes | 8 |
| utf8_spanish_ci | utf8 | 199 | | Yes | 8 |
| utf8_swedish_ci | utf8 | 200 | | Yes | 8 |
| utf8_turkish_ci | utf8 | 201 | | Yes | 8 |
| utf8_czech_ci | utf8 | 202 | | Yes | 8 |
| utf8_danish_ci | utf8 | 203 | | Yes | 8 |
| utf8_lithuanian_ci | utf8 | 204 | | Yes | 8 |
| utf8_slovak_ci | utf8 | 205 | | Yes | 8 |
| utf8_spanish2_ci | utf8 | 206 | | Yes | 8 |
| utf8_roman_ci | utf8 | 207 | | Yes | 8 |
| utf8_persian_ci | utf8 | 208 | | Yes | 8 |
| utf8_esperanto_ci | utf8 | 209 | | Yes | 8 |
| utf8_hungarian_ci | utf8 | 210 | | Yes | 8 |
| utf8_sinhala_ci | utf8 | 211 | | Yes | 8 |
| utf8_german2_ci | utf8 | 212 | | Yes | 8 |
| utf8_croatian_ci | utf8 | 213 | | Yes | 8 |
| utf8_unicode_520_ci | utf8 | 214 | | Yes | 8 |
| utf8_vietnamese_ci | utf8 | 215 | | Yes | 8 |
| utf8_general_mysql500_ci | utf8 | 223 | | Yes | 1 |
+--------------------------+---------+-----+---------+----------+---------+
27 rows in set (0.00 sec)
这其中的规律是:
“utf8”前缀:表⽰规则所属的字符集
紧跟前缀:表⽰规则所应⽤的语⾔
“ci”后缀:表⽰是否区分语⾔中的重⾳、⼤⼩写等
后缀全称含义
_ai accent insensitive不区分重⾳
_as accent sensitive区分重⾳
_ci case insensitive不区分⼤⼩写
_cs case sensitive区分⼤⼩写
_bin binary以⼆进制⽅式⽐较
⽰例:utf8_spanish_ci表⽰以西班⽛语⽐较,且不区分⼤⼩写
3.3 字符集和⽐较规则的应⽤
3.3.1 各级别的字符集和⽐较规则
MySQL存在4个级别的字符集和⽐较规则,分别是服务器级别、数据库级别、表级别、列级别
1 服务器级别
MySQL通过两个系统变量来管理服务器级别的字符集和⽐较规则,通过show variables like 'character_set_server\collation_server';查看这两个变量系统标量描述
character_set_server服务器级别的字符集
collation_server服务器级别的字符集⽐较规则
可以通过在ini配置⽂件中配置这两个变量来制定具体的字符集和规则,
2 数据库级别
在创建和修改数据库时就可以制定该数据库的字符集和⽐较规则:
create database demo01
character set gb2312
collate gb2312_chinese_ci;
在创建完数据并选择中数据库后,可以使⽤
show variables like 'character_set_database';
show variables like 'collation_data%';
来查看这两个变量,但是,我们只能通过这两个变量来查看数据库级别的字符集和⽐较规则,⽽不能通过这两个变量进⾏修改
3 表级别
指定⽅式相同:
create table t(
col varchar(10)
)
character set utf8
collate utf8_general_ci;
既然是表的属性,⾃然可以通过alter关键字进⾏修改
alter table t
character set gbk
collate gbk_chinese_ci;
alter table t
javascript高级程序设计在线观看character set utf8
collate utf8_general_ci;
4 列级别
制定⽅式:
create table t(
col varchar(10) character set utf8 collate utf8_general_ci
);
修改⽅式:
alter table t modify col varchar(10) character set gbk collate gbk_chinese_ci;
float是什么意思啊英语要注意的是,在修改字符集和⽐较规则的时候,如果两个字符集的字符不能相互表⽰就会引起错误,⽐如将ASCⅡ的转换成utf8
5 仅修改字符集或者⽐较规则
只修改字符集,⽐较规则会⾃动变成字符集默认的⽐较规则
只修改⽐较规则,字符集会变成与之对应的
了解字符集和⽐较规则后,我们就能够清楚地判断⼀条记录的实际⼤⼩了
3.3.2 客户端和服务器通信过程中使⽤的字符集
对于同⼀个字符,如果编码和解码使⽤的字符集不⼀样就会产⽣不必要的误解,因此我们需要⼀套字符集转换的系统:即按照utf8字符集对0xE68891进⾏解码,随后按照GBK字符集编码成0XCED2,这样就完成了汉字“我”跨字符集的转换。在MySQL中,这样的转换时常发⽣客户端发送请求
MySQL客户端种类繁多,默认的客户端(bin下的mysql程序)使⽤的字符集和操作系统⼀致,要查看操作系统的字符集:UNIX:LC_ALL、LC_CTYPE、LANG这三个环境变量依次决定了系统的字符集
Windows:通过使⽤命令chcp查看
在Windows下,通过在ini或者在启动命令中指定default-character-set的值来修改客户端默认字符集
服务器接收请求
本质上说,服务器接收到的请求就是⼀个字节序列,⽽它认为这个字节序列的编码就是character_set_client对应的值(每个客户端有单独的值),如果改变这个值,将会产⽣意料之中的错误:
set character_set_client=ascii;
mysql> select '发达';
+--------+
| |
+--------+
| |
+--------+
mysql> set character_set_client=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> select '发达';
+--------+
| 发达 |
+--------+
| 发达 |
+--------+
服务器处理请求
服务器使⽤character_set_client指定的字符集来解析字节序列,但真正处理它们还需要将解析后的字节序列转换成由character_set_connection指定的编码后进⾏。为什么要多加转换的⼀步呢?
mysql> select 'a' = 'A';
+-----------+
| 'a' = 'A' |
+-----------+
| 1 |
+-----------+
1 row in set (0.00 sec)
在上⾯这个例⼦中,服务器在接收到请求后⽆法判断这两个字符所处的字符集和⽐较规则,此时character_set_connection就发挥了作⽤,上述情况是字符集制定为utf8的情况,下⾯这种就不⼀样了:
mysql> set character_set_connection=gbk;
Query OK, 0 rows affected (0.00 sec)
mysql> set collation_connection=gbk_bin;
Query OK, 0 rows affected (0.00 sec)
mysql> select 'a' = 'A';
+-----------+
| 'a' = 'A' |
+-----------+
| 0 |
+-----------+
黄页是谁创建的1 row in set (0.00 sec)
可以看到,再将连接字符集和⽐较规则改变后,⽐较结果就发⽣了变化。那么问题⼜来了,客户端不是有⼀套字符集和⽐较规则嘛,直接⽤客户端的不就⾏了!可有些时候,你会拿字符串和表中的数据进⾏⽐较,这时候就需要连接字符集来进⾏统⼀了:
mysql> create table tt( c varchar(100)) engine=innodb charset=utf8;
select * from tt where c = '我';
表格中的数据是utf8编码的,⽽客户端发送的请求字节序列确实按照character_set_client指定的,若这个变量的值为gbk,那么这两个字符⽐较起来就⿇烦了,因此,需要统⼀地将他们转换成优先级更⾼的字符(在这⾥就是表中的utf8)windowsserver2008r2enterprise
服务器⽣成响应
在读取到数据结果后,服务器会根据character_set_results系统变量对应的字符编集进⾏转换后返回给客户端
客户端收到响应
客户端会使⽤客户端默认的字符集来解释这个由服务器返回的字节序列,以下的例⼦中将返回结果字符集设置成了gbk,⽽客户端字符集为utf8,于是就产⽣了乱码!所以,暂且来看,client和result要保持⼀致
mysql> set character_set_results=gbk;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from tt;
+------+
| c |
+------+
| ÎÒ |
+------+
1 row in set (0.00 sec)
另外,可以通过set names charset_name;来⼀键配置这三个变量,还可以在ini⽂件中配置default-character-set来配置这些变量
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论