在MySQL中,sql mode主要常用来解决以下几类问题
1,通过设置sql mode,可以完成不同严格程度的数据校验,有效的保障数据的准确性(TRADITIONAL,STRICT_TRANS_TABLES)
【注:NO_BACKSLASH_ESCAPES可以使反斜线变为普通字符;PIPES_AS_CONCAT:可以将||视作字符串连接符操作;ANSI可以使超出字符串仍然添加成功,严格模式的会直接报错】
2,通过设置sql mode为ansi模式,来保证大多数sql符合表标准的sql语法,这样应用子啊不同数据库之间进行迁移时,则不需要对业务进行较大的修改
3,在不同数据库之间进行数据库前一之前,可以通过设置sql mode可以使mysql上的数据更方便的迁移到目标数据库之中
【注:在数据迁移过程中,可以设置sql mode为no_table_options模式,这样将去掉show create table中的‘engine’关键字,获得通用的建表脚本】
修改sql mode:
set [session|global] sql_mode=‘modes’;,其中session表示只有在本次链接中生效,global值得是在本次链接中不生效,在新的链接则生效
查看sql mode:
SHOW VARIABLES LIKE ‘%partition%’;
如果输出:
have_partitioning YES
表示支持分区。
或者通过:
SHOW PLUGINS;
显示所有插件,如果有partition ACTIVE STORAGE ENGINE GPL 插件则表明支持分区

常用的sql mode:
      ansi:这种语法使语法和行为更符合标准的sql;
      strict_trans_tables:不允许非法日期,也不允许超过字段长度的值插入字段中,对于插入不正确的值给出错误而不是警告;
      【注:如果不能将给定的值插入到事务表中,则放弃该语句。对于非事务表,如果值出现在单行语句或多行语句的第1行,则放弃该语句。本节后面给出了更详细的描述。】
      traditional:对于插入不正确的值会给出错误而不是警告,可以应用在事务表和非事务表,用在事务表的时候只要出现错误就会立即回滚;cardinality大大少于数据的实际散列程度
      【注:一旦发现错误立即放弃INSERT/UPDATE。如果你使用非事务存储引擎,这种方式不是你想要的,因为出现错误前进行的数据更改不会“滚动”,结果是更新“只进行了一部分”。】