MYSQL理解-运行配置

启动设置参数:

启动时命令
mysqld --skip-networking
mysqld --default-storage-engine=MyISAM
在启动时配置参数

my.cnf配置文件介绍:

image.png

my.cnf配置文件分组:

image.png

[mysqld] 和 [mysql] 组分别应用于 mysqld 服务器程序和 mysql 客户端程序
[server] 组下边的启动选项将作用于所有的服务器程序。
[client] 组下边的启动选项将作用于所有的客户端程序。

my.cnf各种启动命令会读取的组:

image.png
现在我们以 macOS 操作系统为例,在 /etc/mysql/my.cnf 这个配置文件中添加一些内容:
[server]
skip-networking
default-storage-engine=MyISAM
直接用 mysqld 启动服务器程序这个就生效了

通过启动设置系统变量:

如果同一个启动选项既出现在命令行中,又出现在配置文件中,那么以命令行中的启动选项为准!

比如我们在配置文件中写了:
[server]
default-storage-engine=InnoDB
而我们的启动命令是:
mysql.server start --default-storage-engine=MyISAM 那最后 default-storage-engine 的值就是 MyISAM !

对于启动选项来说,如果启动选项名由多个单词组成,各个单词之间用短划线 - 或者下划线 _ 连接起来都可
以,但是对应的系统变量之间必须使用下划线 _ 连接起来。

mysql一个服务端设置不同的客户端配置:

GLOBAL :全局变量,影响服务器的整体操作。
SESSION :会话变量,影响某个客户端连接的操作。(注: SESSION 有个别名叫 LOCAL )

服务器启动时,全局变量为默认值,但是每个连接的客户端有一个会话变量

比如我们想在服务器运行过程中把作用范围为 GLOBAL 的系统变量 default_storage_engine 的值修改为
MyISAM ,也就是想让之后新连接到服务器的客户端都用 MyISAM 作为默认的存储引擎,那我们可以选择下边两条
语句中的任意一条来进行设置:
语句一:SET GLOBAL default_storage_engine = MyISAM;
语句二:SET @@GLOBAL.default_storage_engine = MyISAM;

如果只想对本客户端生效,也可以选择下边三条语句中的任意一条来进行设置:
语句一:SET SESSION default_storage_engine = MyISAM;
语句二:SET @@SESSION.default_storage_engine = MyISAM;
语句三:SET default_storage_engine = MyISAM;
从上边的 语句三 也可以看出,如果在设置系统变量的语句中省略了作用范围,默认的作用范围就是 SESSION 。
也就是说 SET 系统变量名 = 值 和 SET SESSION 系统变量名 = 值 是等价的。

查询全局变量:
SHOW GLOBAL VARIABLES LIKE ‘default_storage_engine’;
查询会话变量:
SHOW SESSION VARIABLES LIKE ‘default_storage_engine’;

注意:
max_connections :只能用于全局

insert_id:只用于会话

有些系统变量是只读的,并不能设置值

状态变量:

由于 状态变量 是用来显示服务器程序运行状况的,所以它们的值只能由服务器程序自己来设置,我们程序员是 不能设置的。与 系统变量 类似, 状态变量 也有 GLOBAL 和 SESSION 两个作用范围的,所以查看 状态变量 的语 句可以这么写:
SHOW [GLOBAL|SESSION] STATUS [LIKE 匹配的模式];
默认的作用范围是 SESSION
SHOW STATUS LIKE ‘thread%’;

Mysql字符集:

image.png
一个字节最多只能表示256种符号,只够英文,中文需要两个字节,256*256

utf8mb3 :阉割过的 utf8 字符集,只使用1~3个字节表示字符。
utf8mb4 :正宗的 utf8 字符集,使用1~4个字节表示字符。

注意:在 MySQL 中 utf8 是 utf8mb3 的别名,一个字符最大长度会影响性能,如果存储emoji表情,用utf8mb4
详情:https://zhuanlan.zhihu.com/p/110790115

image.png

mysql常用字节,maxlen最大字节

字符集比较规则:

mysql> show collation like 'utf8%';

+--------------------------+---------+-----+---------+----------+---------+
| Collation                | Charset | Id  | Default | Compiled | Sortlen |
+--------------------------+---------+-----+---------+----------+---------+
| utf8_general_ci          | utf8    |  33 | Yes     | Yes      |       1 |
| utf8_bin                 | utf8    |  83 |         | Yes      |       1 |
| 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 |
| utf8mb4_general_ci       | utf8mb4 |  45 | Yes     | Yes      |       1 |
| utf8mb4_bin              | utf8mb4 |  46 |         | Yes      |       1 |
| utf8mb4_unicode_ci       | utf8mb4 | 224 |         | Yes      |       8 |
| utf8mb4_icelandic_ci     | utf8mb4 | 225 |         | Yes      |       8 |
+--------------------------+---------+-----+---------+----------+---------+
53 rows in set (0.00 sec)
后缀英文解释描述
_aiaccent insensitive不区分重音
_asaccent sensitive区分重音
_cicase insensitive不区分大小写
_cscase sensitive区分大小写
_binbinary以二进制方式比较

比如 utf8_general_ci 这个比较规则是以 ci 结尾的,说明不区分大小写。

如果创建或修改列时没有显式的指定字符集和比较规则,则该列默认用表的字符集和比较规则
如果创建或修改表时没有显式的指定字符集和比较规则,则该表默认用数据库的字符集和比较规则
如果创建或修改数据库时没有显式的指定字符集和比较规则,则该数据库默认用服务器的字符集和比较规则

image.png

编码和解码使用的字符集不一致的后果:

image.png
注意:
1.服务器认为客户端发送过来的请求是用 character_set_client 编码的。
假设你的客户端采用的字符集和 character_set_client 不一样的话,这就会出现意想不到的情况。比如我的 客户端使用的是 utf8 字符集,如果把系统变量 character_set_client 的值设置为 ascii 的话,服务器可 能无法理解我们发送的请求,更别谈处理这个请求了。
2.服务器将把得到的结果集使用 character_set_results 编码后发送给客户端。
假设你的客户端采用的字符集和 character_set_results 不一样的话,这就可能会出现客户端无法解码结果 集的情况,结果就是在你的屏幕上出现乱码。比如我的客户端使用的是 utf8 字符集,如果把系统变量
character_set_results 的值设置为 ascii 的话,可能会产生乱码。
3.character_set_connection 只是服务器在将请求的字节串从 character_set_client 转换为 character_set_connection 时使用,它是什么其实没多重要,但是一定要注意,该字符集包含的字符范围
一定涵盖请求中的字符,要不然会导致有的字符无法使用 character_set_connection 代表的字符集进行编
码。比如你把 character_set_client 设置为 utf8 ,把 character_set_connection 设置成 ascii ,那么此 时你如果从客户端发送一个汉字到服务器,那么服务器无法使用 ascii 字符集来编码这个汉字,就会向用户 发出一个警告。

解决方案:
我们通常都把 character_set_client 、character_set_connection、 character_set_results 这三个系统变量设成和客户端使用的字符集一致的情况
SET NAMES 字符集名;
这一条语句产生的效果和我们执行这3条的效果是一样的:
SET character_set_client = 字符集名;
SET character_set_connection = 字符集名; SET character_set_results = 字符集名;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值