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 |
该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,那么这个选项就有用了 |
STRICT_TRANS_TABLES |
在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制 |
NO_ZERO_IN_DATE |
在严格模式下,不允许日期和月份为零 |
NO_ZERO_DATE |
设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告 |
ERROR_FOR_DIVISION_BY_ZERO |
在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时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;
来源:oschina
链接:https://my.oschina.net/u/3398733/blog/4831230