MYSQL理解-运行配置

启动设置参数:

启动时命令

mysqld --skip-networking

mysqld --default-storage-engine=MyISAM

在启动时配置参数

my.cnf配置文件介绍:

my.cnf配置文件分组:

[mysqld] 和 [mysql] 组分别应用于 mysqld 服务器程序和 mysql 客户端程序

[server] 组下边的启动选项将作用于所有的服务器程序。

[client] 组下边的启动选项将作用于所有的客户端程序。

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

现在我们以 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字符集:

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

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

utf8mb4 :正宗的 utf8 字符集,使用1~4个字节表示字符。

注意:在 MySQL 中 utf8 是 utf8mb3 的别名,一个字符最大长度会影响性能,如果存储emoji表情,用utf8mb4

详情:https://zhuanlan.zhihu.com/p/110790115

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)
后缀 英文解释 描述
_ai accent insensitive 不区分重音
_as accent sensitive 区分重音
_ci case insensitive 不区分大小写
_cs case sensitive 区分大小写
_bin binary 以二进制方式比较

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

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

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

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

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

注意:

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 = 字符集名;

相关推荐
无极程序员31 分钟前
PHP常量
android·ide·android studio
zmgst40 分钟前
canal1.1.7使用canal-adapter进行mysql同步数据
java·数据库·mysql
令狐少侠201141 分钟前
explain执行计划分析 ref_
mysql
随心............42 分钟前
python操作MySQL以及SQL综合案例
数据库·mysql
xjjeffery1 小时前
MySQL 基础
数据库·mysql
恒辉信达1 小时前
hhdb数据库介绍(8-4)
服务器·数据库·mysql
萌面小侠Plus2 小时前
Android笔记(三十三):封装设备性能级别判断工具——低端机还是高端机
android·性能优化·kotlin·工具类·低端机
慢慢成长的码农2 小时前
Android Profiler 内存分析
android
大风起兮云飞扬丶2 小时前
Android——多线程、线程通信、handler机制
android
L72562 小时前
Android的Handler
android