启动时命令
mysqld --skip-networking
mysqld --default-storage-engine=MyISAM
在启动时配置参数
[mysqld] 和 [mysql] 组分别应用于 mysqld 服务器程序和 mysql 客户端程序
[server] 组下边的启动选项将作用于所有的服务器程序。
[client] 组下边的启动选项将作用于所有的客户端程序。
现在我们以 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 !
对于启动选项来说,如果启动选项名由多个单词组成,各个单词之间用短划线 - 或者下划线 _ 连接起来都可
以,但是对应的系统变量之间必须使用下划线 _ 连接起来。
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%’;
一个字节最多只能表示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 = 字符集名;