最近用蝉知的CMS 建站比较多,感觉蛮顺手的,但在给客户安装的时候却会出现安装报错,其原因也很简单

查看了一下他们的install.sql文件中,有些时间字段的默认值是0000-00-00 00:00:00 ... 额,我个人习惯将时间值存int类型,这样程序处理上还有查询计算上会方便一些,可能他们为了在看数据库的时候方便一目了然的认出时间吧...不管它的初衷,要改程序不太可能了,以后也不好升级.我还是改我的数据库的兼容模式吧

在MySQL5.5以后,其默认使用的是一种严格模式,也就是说,像禅知用的这种默认值的方式就会报错.SO,我们今天来说一说这个SQL_MODEL的相关的东东

SQL_MODE:通过对其正确的设置可以完成一些约束检查的工作,设置时,可在配置文件my.cnf或my.ini中进行,也可在客户端中进行,并可分别进行全局的设置或当前会话的设置。

查看SQL_MODE设置情况():

mysql> SHOW VARIABLES LIKE 'SQL_MODE';
+---------------+----------------------------------------------------------------+
| Variable_name | Value |
+---------------+----------------------------------------------------------------+
| sql_mode | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+----------------------------------------------------------------+
row in set (0.03 sec)

或者(全局)

mysql> SELECT @@global.SQL_MODE;
+----------------------------------------------------------------+
| @@global.SQL_MODE |
+----------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------+
row in set (0.00 sec)

亦或(当前会话)

mysql> SELECT @@session.SQL_MODE;
+----------------------------------------------------------------+
| @@session.SQL_MODE |
+----------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------+
row in set (0.00 sec)

亦或

mysql> SELECT @@SQL_MODE;
+----------------------------------------------------------------+
| @@session.SQL_MODE |
+----------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------+
row in set (0.00 sec)

设置方法很简单

mysql> SET global sql_mode='STRICT_TRANS_TABLES';
Query OK, rows affected (0.00 sec)

mysql> SET sql_mode='STRICT_TRANS_TABLES';
Query OK, rows affected (0.00 sec)

介绍一下几种模式

STRICT_TRANS_TALES(严格模式):
只对支持事务的表启用严格模式

STRICT_ALL_TABLES(严格模式):
对所有引擎的表都启用严格模式

ALLOW_INVALID_DATES:
不完全对日期合法性作检查,只检查月份是否在1~12,日期是否在1~31之间;仅对DATE和DATETIME有效,而对TIMESTAMP无效,因为TIMESTAMP总要求一个合法的输入。

ANSI_QUOTES:
启用后,不能用双引号来引用字符串,因为"(双引号)将被解释为标识符

mysql> CREATE TABLE a ( a char());
Query OK, rows affected (0.26 sec) mysql> INSERT INTO a SELECT 'abc';
Query OK, row affected (0.05 sec)
Records: Duplicates: Warnings: mysql> SET SQL_MODE='ANSI_QUOTES';
Query OK, rows affected (0.00 sec) mysql> INSERT INTO a SELECT "abc";
ERROR (42S22): Unknown column 'abc' in 'field list' mysql> SELECT @@session.sql_mode;
+--------------------+
| @@session.sql_mode |
+--------------------+
| ANSI_QUOTES |
+--------------------+
row in set (0.00 sec)

ERROR_FOR_DIVISION_BY_ZERO:
启用后,在insert或update过程中,若数据被零除(或MOD(x,0),则产生错误,若未启用,则产生警告,数据被零除时系统返回NULL。

HIGH_NOT_PRECEDENCE:
启用后,可获得以前旧版本的优先级:
NOT a BETWEEN b AND c这个语句:
now: NOT (a BETWEEN b AND c)
before: (NOT a) BETWEEN b AND c

IGNORE_SPACE:
启用后,忽略函数名和括号"("之间空格,要访问保存为关键字的数据库名,表名,列名时,需启用。

mysql> SELECT NOW();
ERROR (): FUNCTION test.NOW does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual
mysql> SET SQL_MODE='IGNORE_SPACE';
Query OK, rows affected (0.00 sec) mysql> SELECT NOW();
+---------------------+
| NOW () |
+---------------------+
| -- :: |
+---------------------+
row in set (0.00 sec)

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

NO_AUTO_VALUE_ON_ZERO:
在自增长的列中插入0或NULL将不会是下一个自增长值。

O_BACKSLASH_ESCAPES:
反斜杠\作为普通字符而非转义字符

mysql> SET SQL_MODE='';
Query OK, rows affected (0.00 sec) mysql> SELECT '\\';
+---+
| \ |
+---+
| \ |
+---+
row in set (0.00 sec) mysql> SET SQL_MODE='NO_BACKSLASH_ESCAPES';
Query OK, rows affected (0.00 sec) mysql> SELECT '\\';
+----+
| \\ |
+----+
| \\ |
+----+
row in set (0.00 sec)

NO_DIR_IN_CREATE:
在创建表时忽略所有index directory和data directory的选项。

NO_ENGINE_SUBSTITUTION:
启用后,若需要的存储引擎被禁用或未编译,则抛出错误;未启用时将用默认的存储引擎代替,并抛出一个异常。

NO_UNSIGNED_SUBSTRACTION:
启用后,两个UNSIGNED类型相减返回SIGNED类型。

NO_ZERO_DATE:
启用后,不允许插入"0000-00-00 00:00:00"形如此类的零日期,这将抛出一个错误,若未启用,则可插入但仅会抛出一个警告。

NO_ZERO_IN_DATE:
启用后,不允许月份和日期为零,和NO_ZERO_DATE一起启用,如"1999-01-00"将抛出错误而非警告。
若单独启用本项,则会抛出warning,然后插入如“0000-00-00 00:00:00”。

ONLY_FULL_GROUP_BY:
对于GROUP BY聚合操作,若select中的列没有在group by中出现,那么这句SQL是不合法的。

PAD_CHAR_TO_FULL_LENGTH:
启用后,对于CHAR类型将不会截断空洞数据

mysql> CREATE TABLE a ( a char(), b varchar());
Query OK, rows affected (0.29 sec) mysql> INSERT INTO a SELECT 'a','b';
Query OK, row affected (0.03 sec)
Records: Duplicates: Warnings: ; mysql> SELECT CHAR_LENGTH(a), CHAR_LENGTH(b) FROM a;
+----------------+----------------+
| CHAR_LENGTH(a) | CHAR_LENGTH(b) |
+----------------+----------------+
| | |
+----------------+----------------+
row in set (0.01 sec) mysql> SET SQL_MODE='PAD_CHAR_TO_FULL_LENGTH';
Query OK, rows affected (0.00 sec) mysql> SELECT CHAR_LENGTH(a), CHAR_LENGTH(b) FROM a;
+----------------+----------------+
| CHAR_LENGTH(a) | CHAR_LENGTH(b) |
+----------------+----------------+
| | |
+----------------+----------------+
row in set (0.00 sec)

PIPES_AS_CONCAT:
将"||"视为连接操作符而非"或运算符"。

REAL_AS_FLOA
T:
将REAL视为FLOAT的同义词而非DOUBLE的同义词。

蝉知相关产品的解决办法也就很明了啦~~:

先查看本地的模式

mysql> SELECT @@global.SQL_MODE;
+---------------------------------------------------------------------------------------------+
| @@global.SQL_MODE |
+---------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------------------------------------------------------------------------------------+
row in set (0.00 sec)

然后去掉NO_ZERO_DATE和NO_ZERO_IN_DATE

SET global sql_mode='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
 

当然你也可以在my.cnf中配置

[mysqld]
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

这样就可以不用每次设置啦

原文转自吕滔博客

为什么在有的服务器上禅道、蝉知安装会报错? 之理解MySQL的SQL_MODE的更多相关文章

  1. 禅道Linux一键安装版

    禅道Linux一键安装版 Linux一键安装包内置了apache, php, mysql这些应用程序,只需要下载解压缩即可运行禅道.从7.3版本开始,linux一键安装包分为32位和64位两个包,大家 ...

  2. 解决windows64位系统上安装mysql-python报错

    解决windows64位系统上安装mysql-python报错 2018年03月12日 13:08:24 一个CD包 阅读数:1231    版权声明:本文为博主原创文章,未经博主允许不得转载. ht ...

  3. 【Linux】阿里云服务器部署--禅道

    Xshell部署环境 回到Xshell界面,连上阿里云服务器,参考上一篇[linux学习1-Xshell连接阿里云ECS服务器](https://www.cnblogs.com/yoyoketang/ ...

  4. 禅道——Linux服务器部署禅道

    前言 2019年6月14日 22:01:24 看看时间我知道,我离猝死依然不远~ 禅道是什么 | 禅道是专业的研发项目管理软件 禅道的官网 | https://www.zentao.net/ 禅道开源 ...

  5. joomla安装插件报错:上传文件到服务器发生了一个错误。 过小的PHP文件上传尺寸

    在安装joomla的AKeeba插件的时候报错如下:上传文件到服务器发生了一个错误. 过小的PHP文件上传尺寸.解决方法是修改php.ini文件,打开文件后搜索upload_max_filesize! ...

  6. ftp上传文件,本地安装了,服务器上也需要在也安装一个ftp

    服务器需要配置FTP服务: 你说的在你自己电脑上安装的只是一个FTP软件,用于连接远程服务器进行上传和下载文件的. 追问 在本地已经安装了,链接的话要在服务器上也安装一个吗? 追答 额,你有FTP服务 ...

  7. 【Devops】【docker】【CI/CD】Jenkins源码管理,设置gitlab上项目的clone地址 + jenkins构建报错:Please make sure you have the correct access rights and the repository exists.

    注意,如果 jenkins构建报错:Please make sure you have the correct access rights and the repository exists. 而此时 ...

  8. 转: CentOS上安装LAMP之第二步:PHP环境及安装过程报错解决方案(纯净系统环境)

    最近有空就配置CentOS系统上的AMP环境,现在配置到PHP环境了 多话不说上传送门:http://blog.csdn.net/zhangatle/article/details/77447653 ...

  9. 转: CentOS上安装LAMP之第一步:Apache环境及安装过程报错解决方案(纯净系统环境)

    传送门:http://blog.csdn.net/zhangatle/article/details/77416996  小心坑!填完就懂怎么安装了 Note:要从零开始搭建,就不要嫌中间遇到各种问题 ...

随机推荐

  1. Django 1.10 中文文档------3.2.2 查询操作making queries

    3.2.2 查询操作 6.15章节包含所有模型相关的API解释. 后面的内容基于如下的一个博客应用模型: from django.db import models class Blog(models. ...

  2. jQUery 1.9中被删除的API

    jQuery1.9删除了一些在以前版本中已经过时的api,想要把那些不够安全的.缺乏效率的.用处不大的,以及带有误导的特性统统去掉.如果你想升级你的jquery版本,但又使用了如下被删除的api的话, ...

  3. JavaScript中的逗号运算符

    JavaScript逗号运算符  阅读本文的前提,明确表达式.短语.运算符.运算数这几个概念. 所谓表达式,就是一个JavaScript的“短语”,JavaScript解释器可以计算它,从而生成一个值 ...

  4. Ubuntu软件中心打不开,Encountered a section with no Package: header错误之解决

    sudo rm /var/lib/apt/lists/* -vf sudo apt-get update

  5. 【S】【S】【S】一大波前端干货整合(一)

      前端交流站点 大前端       http://www.daqianduan.com/ V2EX       http://www.v2ex.com/ W3cplus    http://www. ...

  6. 详解Activity的四种启动模式

    在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. Ac ...

  7. .Net程序员学用Oracle系列(3):数据库编程规范

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.书写规范 1.1.大小写风格 1.2.缩进风格 1.3.换行 1.4.其它 2.命名规范 2.1.数据库对象命名 2.2.变 ...

  8. Ambari部署HDP:HBase Master启动后自动消失

    这是第一次出勤部署产品.遇到不可控问题,解决,写个心得.记录一下吧^^ 在排查问题的过程中,学到不少知识. (1)centos系统盘和数据盘分开,装操作系统的人没有将IT的空间分配出来,所以分区,自动 ...

  9. Git项目下载部分文件或文件夹

    我们常常要在Github下载一些源码.示例等,但有时候项目库会比较大,而我关心的只是其中很少的一部分内容,由于众所周知的原因,我们下载git库是比较慢的,过大的项目经常会下载失败,所以只下载部分内容就 ...

  10. Php.ini 文件位置在哪里,怎么找到 php.ini

    Php.ini 文件不是经常用到的,突然有一天,你需要修改它了,却不知道他躲在哪里,怎么破? 一般情况下,它会呆在php的安装目录里. 方法/步骤   1 在你自己的网站目录里,新建一个php文件,写 ...