大家好,今天小编来为大家解答以下的问题,关于localmode是什么意思?用法、例句,MySQL sql_mode应该如何指定这个很多人还不知道,现在让我们一起来看看吧!
sql_mode是个很容易被忽视的变量,在5.6之前默认为空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。在生产环境一般将这个值设置为严格模式。
sql_mode分类及各值定义
两种组合模式:
一、测试sql_mode=''
(root@localhost)[(none)]>select@@sql_mode;\n+---------------+\n|@@sql_mode|\n+---------------+\n||\n+---------------+\n
1.测试创建不存在的表引擎
(root@localhost)[test]>CREATETABLE`test_4`(\n->`id`int(11)DEFAULTNULL,\n->`name`varchar(20)DEFAULTNULL,\n->`addr`varchar(10)DEFAULTNULL,\n->`sex`varchar(2)DEFAULTNULL\n->)ENGINE=ssssssDEFAULTCHARSET=utf8;\nQueryOK,0rowsaffected,2warnings(0.00sec)\n
可以创建成功,但是有warning,不存在ssssss存储引擎,采用默认InnoDB引擎。
(root@localhost)[test]>showwarnings;\n+---------+------+------------------------------------------------+\n|Level|Code|Message|\n+---------+------+------------------------------------------------+\n|Warning|1286|Unknownstorageengine'ssssss'|\n|Warning|1266|UsingstorageengineInnoDBfortable'test_4'|\n+---------+------+------------------------------------------------+\n
查看表结构,存储引擎为innodb引擎。
(root@localhost)[test]>showcreatetabletest_4\\G\n***************************1.row***************************\nTable:test_4\nCreateTable:CREATETABLE`test_4`\n(`id`int(11)DEFAULTNULL,\n`name`varchar(20)DEFAULTNULL,\n`addr`varchar(10)DEFAULTNULL,\n`sex`varchar(2)DEFAULTNULL)\nENGINE=InnoDBDEFAULTCHARSET=utf8\n1rowinset(0.00sec)\n
2.测试insert值超过指定字符类型长度
(root@localhost)[test]>insertintotest_4(id,name,addr,sex)\nvalues(1,'aa','aa','aaaaaaaaaa');\nQueryOK,1rowaffected,1warning(0.00sec)\n
可以插入,但是有warning。
(root@localhost)[test]>showwarnings;\n+-------+------+-------------------------------------------------------------+\n|Level|Code|Message|+-------+------+------------------------------------------------------------+\n|Error|1064|YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear'warning'atline1|\n+-------+------+-------------------------------------------------------------+\n
查看数据,超长字段值被截断。
(root@localhost)[test]>select*fromtest_4;\n+------+------+------+------+\n|id|name|addr|sex|\n+------+------+------+------+\n|1|aa|aa|aa|\n+------+------+------+------+\n1rowinset(0.00sec)\n
二、测试sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES'
1.建表,不存在ssssss存储引擎,直接报错
(root@localhost)[test]>CREATETABLE`test_5`(\n->`id`int(11)DEFAULTNULL,\n->`name`varchar(20)DEFAULTNULL,\n->`addr`varchar(10)NOTNULL,\n->`sex`varchar(2)DEFAULTNULL\n->)ENGINE=ssssssDEFAULTCHARSET=utf8;\nERROR1286(42000):Unknownstorageengine'ssssss'\n
2.测试insert值超过字符类型长度,直接报错
(root@localhost)[test]>insertintotest_4(id,name,addr,sex)\nvalues(2,'aa','aa','cccccccc');\nERROR1406(22001):Datatoolongforcolumn'sex'atrow1\n
3.测试插入非空字段不带值,直接报错
(root@localhost)[test]>insertintotest_4(id)values(6);\nERROR1364(HY000):Field'addr'doesn'thaveadefaultvalue\n
三、测试sql_mode='ONLY_FULL_GROUP_BY'
(root@localhost)[test]>set@@sql_mode=ONLY_FULL_GROUP_BY;\nQueryOK,0rowsaffected(0.00sec)?\n(root@localhost)[test]>select@@sql_mode;\n+--------------------+\n|@@sql_mode|\n+--------------------+\n|ONLY_FULL_GROUP_BY|\n+--------------------+?\n(root@localhost)[test]>selectemailfromtest1groupbyname;\nERROR1055(42000):'test.test1.email'isn'tinGROUPBY\n
对于GROUPBY聚合操作,如果在SELECT中的列,没有在GROUPBY中出现,那么将认为这个SQL是不合法的,因为列不在GROUPBY从句中。
四、测试sql_mode='NO_AUTO_CREATE_USER'
(root@localhost)[(none)]>setsql_mode=NO_AUTO_CREATE_USER;\nQueryOK,0rowsaffected(0.00sec)\n?(root@localhost)[(none)]>select@@sql_mode;\n+---------------------+\n|@@sql_mode|\n+---------------------+\n|NO_AUTO_CREATE_USER|\n+---------------------+\n1rowinset(0.00sec)?\n(root@localhost)[(none)]>grantselectontest.*to'test_user'@'%';\nERROR1133(42000):Can'tfindanymatchingrowintheusertable\n(root@localhost)[(none)]>grantselectontest.*to'test_user'@'%'identifiedby"123456";\nQueryOK,0rowsaffected(0.00sec)\n
grant...on操作不带密码的话会直接报错,带密码则可以创建。
sql_mode设置哪种类型需要根据业务使用场景来定:
比如insert时,超过字段长度,业务设计不允许截断插入,而是直接失败,那么就需要指定STRICT_TRANS_TABLES模式。而有些业务则是相反,允许截断插入,则不需要指定STRICT_TRANS_TABLES模式。
sql_mode='NO_ENGINE_SUBSTITUTION'
sql_mode='NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES'
OK,关于localmode是什么意思?用法、例句和MySQL sql_mode应该如何指定的内容到此结束了,希望对大家有所帮助。