设为首页 收藏本站
查看: 1501|回复: 0

[经验分享] mysql服务器变量的管理及其SQL模型浅谈

[复制链接]

尚未签到

发表于 2018-10-23 12:43:40 | 显示全部楼层 |阅读模式
  一、mysql的服务器变量
  MySQL服务器维护了两大类变量,一个是服务器变量,另一个是状态变量。其中:
  服务器变量
  服务器变量定义MySQL服务器运行时的工作特性
  1、 mysql服务器变量根据作用域可以分为全局变量和会话变量:
  全局变量:作用于服务器级别,对当前会话无效,对新建会话生效。
  查看mysql的全局变量及其值,使用如下命令:
  #SHOW GLOBAL VARIABLES [LIKE 'STRING'];
  会话变量:作用于当前会话级别,会话建立时,从全局变量继承各变量;会话变量只对当前会话生效,即及时生效。对其他会话无效。
  查看mysql的会话变量及其值,使用如下命令:
  #SHOW [SESSION] VARIABLES [LIKE 'STRING']
  说明:不管是全局变量还是会话变量的动态调整,当mysql服务器重启时,其变量值都会失效,要想永久生效,需要将其写入到mysql配置文件中的[mysqld]配置段里。
  2、mysql服务器变量根据生效时间,可以将其分为动态变量和静态变量:
  动态变量:可以在mysql运行时修改 。
  静态变量:需要在mysql配置文件中进行修改,且重启后永久生效。
  3、查看服务器变量及其值
  查看服务器变量及其值有4种方式,这些方式如下:
  (a)、mysql>  SELECT @@[global.|session.]VARIABLE_NAME;
  (b)、mysql> show [global|session] variables [like 'string'];
  (c)、mysql> select * from information_schema.GLOBAL_VARIABLES where GLOBAL_VARIABLES.VARIABLE_NAME = 'some_variable';用于查看全局变量。如:
  mysql> select * from information_schema.GLOBAL_VARIABLES where GLOBAL_VARIABLES.VARIABLE_NAME = 'sql_mode';
  (d)、mysql> select * from infomation_schema.SESSION_VARIABLES where SESSION_VARIABLES.VARIABLE_NAME = 'some_variable';用于查看会话变量。如:
  mysql> select * from information_schema.SESSION_VARIABLES where SESSION_VARIABLES.VARIABLE_NAME = 'SQL_MODE';
  4、设定服务器变量及其值
  mysql> SET {GLOBALlSESSION}  VARIABLE_NAME='VALUE'
  mysql状态变量
  mysql状态变量保存了MySQL服务器运行时的统计数据
  查看mysql的状态变量信息,使用如下命令:
  #SHOW [GLOBAL|SESSION]  STATUS [LIKE 'STRING']
  二、mysql的SQL模型
  mysql的SQL模型用来定义某些规则,限制写入的数据,并作出相应的处理。
  常见的SQL模型有如下几种:
  ANSI:宽松模式,对向mysql数据库写入的数据进行校验,如果写入的数据不符合定义的类型或长度,则会对数据类型进行调整或将写入的数据截断并保存,最后报warning警告。
  TRADITIONAL:传统模式,当向mysql数据写入的数据进行严格校验,如果数据不符合,则该数据不能被写入。并报error错误。如果用于事务时,会进行事务回滚。
  STRICT_TRANS_TABLES:仅支持事务的表的严格模式。当有数据写入时进行严格校验,向一个支持事务的表中写入不符合的数据时,拒绝数据写入,并报error错误。仅用于支持事务的表。
  STRICT_ALL_TABLES:对所有表使用严格模式,当有数据写入时进行严格校验,如果写入的数据不符合规则时,则拒绝写入。并返回错误。
  1、查看默认的sql模型
  默认mysql 的模型为空,使用如下命令可以查看当前服务器的sql模型。
  mysql> select @@sql_mode;
  +------------+
  | @@sql_mode |
  +------------+
  |            |
  +------------+
  1 row in set (0.00 sec)
  2、创建一张stu表
  mysql> create database testdb;
  mysql> use testdb;
  mysql> create table stu(sid tinyint unsigned not null  auto_increment primary key,name char(4) not null,gender enum('F','M') default 'F',age tinyint unsigned not null );
  Query OK, 0 rows affected (0.03 sec)
  查看表stu结构
  mysql> desc stu;
  +--------+---------------------+------+-----+---------+----------------+
  | Field  | Type                | Null | Key | Default | Extra          |
  +--------+---------------------+------+-----+---------+----------------+
  | sid    | tinyint(3) unsigned | NO   | PRI | NULL    | auto_increment |
  | name   | char(4)             | NO   |     | NULL    |                |
  | gender | enum('F','M')       | YES  |     | F       |                |
  | age    | tinyint(3) unsigned | NO   |     | NULL    |                |
  +--------+---------------------+------+-----+---------+----------------+
  4 rows in set (0.00 sec)
  说明:在这个表中,我将name这个字段的长度设置为4个字符长度。
  向表中插入2行数据
  mysql> insert into stu (name,gender,age) value ('Linghuchong','F',30),('Huangjiguang','M',21);
  Query OK, 2 rows affected, 2 warnings (0.01 sec)
  Records: 2  Duplicates: 0  Warnings: 2
  注意到了,插入完成之后,有2个warning。在这里我插入数据时,其name字段的长度都超过了4个字符。
  接着查看数据是否被写入到数据库testdb中。
  mysql> select * from stu;
  +-----+------+--------+-----+
  | sid | name | gender | age |
  +-----+------+--------+-----+
  |   1 | Ling | F      |  30 |
  |   2 | Huan | M      |  21 |
  +-----+------+--------+-----+
  2 rows in set (0.00 sec)
  从结果显示,数据已经写入到了表中,但是name这个字段的数据被截取了,这就是默认的sql模型的限制。当数据的长度超过规定的长度时,数据会被截取并保存。并报warning警告。
  接下来,将sql模型该为TRADITIONAL,然后观察该模型下对数据的限制情况。
  3、将mysql的sql模型改为TRADITIONAL。
  mysql> set session sql_mode='TRADITIONAL';
  Query OK, 0 rows affected (0.00 sec)
  查看当前会话的sql模型
  mysql> show session variables like 'sql_mode';
  +---------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
  | Variable_name | Value                                                                                                                                                |
  +---------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
  | sql_mode      | STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
  +---------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
  1 row in set (0.00 sec)
  然后插入一行数据到stu表中
  mysql> insert into stu (name,gender,age) values ('Liyundi','F',30);
  ERROR 1406 (22001): Data too long for column 'name' at row 1
  看到了吧,当sql模型被修改为TRADITIONAL后,由于name这个字段的长度只有4个字符,因此,当插入的字段长度大于该字段最大长度时,其数据将会拒绝写入到表中,并报error错误。
  查看错误信息
  mysql> show errors;
  +-------+------+------------------------------------------+
  | Level | Code | Message                                  |
  +-------+------+------------------------------------------+
  | Error | 1406 | Data too long for column 'name' at row 1 |
  +-------+------+------------------------------------------+
  1 row in set (0.00 sec)


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-625479-1-1.html 上篇帖子: SQL增、删、改、查 下篇帖子: SQL查询语句详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表