(二)msyql杂项配置

泄露秘密 提交于 2020-12-23 11:31:39

1.杂项配置

1.1 设置大小写不敏感

查看大小写是否敏感

mysql> show variables like '%lower_case_table_names%'

提示:windows系统默认大小写不敏感,但是linux系统是大小写敏感的

设置大小写不敏感

[root@hadoop102 ~]$ vim /etc/my.cnf
#追加如下内容,然后重启服务
[mysqld]
lower_case_table_names = 1
# 0		大小写敏感
# 1		大小写不敏感
# 2		创建的表和DB依据语句上格式存放,凡是查找都是转换为小写进行

注意:如果要设置属性为大小写不敏感,要在重启数据库实例之前就需要将原来的数据库和表转换为小写,否则将找不到数据库名。

在进行数据库参数设置之前,需要掌握这个参数带来的影响,切不可盲目设置。

1.2 sql_mode

sql_mode定义了对Mysql中sql语句语法的校验规则!

sql_mode是个很容易被忽视的变量,如果设置为空值(非严格模式),在这种情况下是可以允许一些非法操作的,比如允许一些非法数据的插入。

在生产环境必须将这个值设置为严格模式,所以开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题。

1.2.1 sql_mode的常用值

ONLY_FULL_GROUP_BY

对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中

NO_AUTO_VALUE_ON_ZERO

该值影响自增长列的插入。默认设置下,插入0NULL代表生成下一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,那么这个选项就有用了

STRICT_TRANS_TABLES

在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制

NO_ZERO_IN_DATE

在严格模式下,不允许日期和月份为零

NO_ZERO_DATE

设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告

ERROR_FOR_DIVISION_BY_ZERO

INSERTUPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL

NO_AUTO_CREATE_USER

禁止GRANT创建密码为空的用户

NO_ENGINE_SUBSTITUTION

如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常

PIPES_AS_CONCAT

"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似

ANSI_QUOTES

启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符

ORACLE

设置等同于PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER

1.2.2 查看当前的sql_mode

 mysql> select @@sql_mode;

1.2.3 临时修改sql_mode

mysql> set @@sql_mode='';

1.2.4 永久修改sql_mode

[root@hadoop102 ~]$ vim /etc/my.cnf
#添加下列配置,然后重启mysql即可
[mysqld]
sql_mode=''

1.2.5 sql_mode的影响案例

CREATE TABLE mytbl2 (id INT,NAME VARCHAR(200),age INT,dept INT);
INSERT INTO mytbl2 VALUES(1,'zhang3',33,101);
INSERT INTO mytbl2 VALUES(2,'li4',34,101);
INSERT INTO mytbl2 VALUES(3,'wang5',34,102);
INSERT INTO mytbl2 VALUES(4,'zhao6',34,102);
INSERT INTO mytbl2 VALUES(5,'tian7',36,102);

查询每个dept中年龄最大的人:
错误结果:
SELECT NAME,dept,MAX(age) FROM mytbl2 GROUP BY dept;
正确结果:
SELECT id,name,ab.dept,ab.maxage FROM mytbl2 m INNER JOIN(SELECT dept,MAX(age)maxage FROM mytbl2 GROUP BY dept)ab ON ab.dept=m.dept AND m.age=ab.maxage;

 

 

 

 

 

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!