坑爹的Mysql

本想尝试下如何使用Spring来管理Hibernate的事务,当配置好Spring的配置文件后,进行插入数据,结果报错了,错误是:

Mysql Field * doesn‘t have a default value,我以为我的配置文件或者代码写错了,我就进行了检查,觉得没有问题,然后我继续执行程序,错误还是这样,我于是将hibernate生成的SQL语句在MySQL的Workbench中进行,Mysql也报了同样的错误,于是我在网上搜索了这个错误,网上的答案是,这个是Mysql的问题,当然也给出了办法:

ield ‘id‘ doesn‘t have a default value

解决方法一:

打开my.ini,查找
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

修改为

sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

然后重启MYSQL

解决方法二:
MySQL 5 uses a strict mode which needs to be disabled.
In Windows, Goto Start-->Programs-->MySQL->MySQL Instance Config Wizard. Follow through the Reconfigure Instance option-->Detailed Configuration-->Continue Next a few screens. At the bottom under Enable TCP/IP option there is ‘Enable Strict Mode‘. Deslect this option (no tick). Save changes and MySQL will restart

  原来在MySQL 5.0.2之前,MySQL对非法或不当值并不严厉,而且为了数据输入还会强制将它们变为合法值。在MySQL 5.0.2和更高版本中,保留了以前的默认行为,但你可以为不良值选择更传统的处理方法,从而使得服务器能够拒绝并放弃出现不良值的语句。本节介绍了MySQL的默认行为(宽大行为),新的严格的SQL模式,以及它们的区别。
  如果你未使用严格模式,下述情况是真实的。如果将“不正确”的值插入到列,如将NULL值插入非NULL列,或将过大的数值插入数值列,MySQL会将这些列设置为“最可能的值”,而不是生成错误信息。
  · 如果试图将超范围的值保存到数值列,MySQL服务器将保存0(最小的可能值)取而代之,或最大的可能值。
  · 对于字符串,MySQL或保存空字符串,或将字符串尽可能多的部分保存到列中。
  · 如果打算将不是以数值开头的字符串保存到数值列,MySQL将保存0。
  · MySQL允许将特定的不正确日期值保存到DATE和DATETIME列(如“2000-02-31”或“2000-02-00”)。其观点在于,验证日期不是SQL服务器的任务。如果MySQL能保存日期值并准确检索相同的值,MySQL就能按给定的值保存它。如果日期完全不正确(超出服务器能保存的范围)将在列中保存特殊的日期值“0000-00-00”取而代之。
  · 如果试图将NULL值保存到不接受NULL值的列,对于单行INSERT语句,将出现错误。对于多行INSERT语句或INSERT INTO ... SELECT语句,MySQL服务器会保存针对列数据类型的隐含默认值。一般情况下,对于数值类型,它是0,对于字符串类型,它是空字符串(‘‘),对于日期和时间类型是“zero”。
  · 如果INSERT语句未为列指定值,如果列定义包含明确的DEFAULT子句,MySQL将插入默认值。如果在定义中没有这类DEFAULT子句,MySQL会插入列数据类型的隐含默认值。
  采用前述规则的原因在于,在语句开始执行前,无法检查这些状况。如果在更新了数行后遇到这类问题,我们不能仅靠回滚解决,这是因为存储引擎可能不支持回滚。中止语句并不是良好的选择,在该情况下,更新完成了“一半”,这或许是最差的情况。对于本例,较好的方法是“仅可能做到最好”,然后就像什么都未发生那样继续。
  在MySQL 5.0.2和更高版本中,可以使用STRICT_TRANS_TABLES或STRICT_ALL_TABLES SQL模式,选择更严格的处理方式。
  STRICT_TRANS_TABLES的工作方式:
  · 对于事务性存储引擎,在语句中任何地方出现的不良数据值均会导致放弃语句并执行回滚。
  · 对于非事务性存储引擎,如果错误出现在要插入或更新的第1行,将放弃语句。(在这种情况下,可以认为语句未改变表,就像事务表一样)。首行后出现的错误不会导致放弃语句。取而代之的是,将调整不良数据值,并给出告警,而不是错误。换句话讲,使用STRICT_TRANS_TABLES后,错误值会导致MySQL执行回滚操作,如果可以,所有更新到此为止。
  要想执行更严格的检查,请启用STRICT_ALL_TABLES。除了非事务性存储引擎,它与STRICT_TRANS_TABLES等同,即使当不良数据出现在首行后的其他行,所产生的错误也会导致放弃语句。这意味着,如果错误出现在非事务性表多行插入或更新过程的中途,仅更新部分结果。前面的行将完成插入或更新,但错误出现点后面的行则不然。对于非事务性表,为了避免这种情况的发生,可使用单行语句,或者在能接受转换警告而不是错误的情况下使用STRICT_TRANS_TABLES。要想在第1场合防止问题的出现,不要使用MySQL来检查列的内容。最安全的方式(通常也较快)是,让应用程序负责,仅将有效值传递给数据库。
  有了严格的模式选项后,可使用INSERT IGNORE或UPDATE IGNORE而不是不带IGNORE的INSERT或UPDATE,将错误当作告警对待。

因为我的Mysql 没有找到配置向导,我就用第一种办法,按照这个方案,程序果然没有报错,顺便说下,网上说的是5.02版本,而我的数据库是5.7版本。

时间: 2024-09-27 17:19:49

坑爹的Mysql的相关文章

吐槽 坑爹的MySQL安装路径选择

一般再windows下面安装MySQL我们都会选择msi安装模式,然而安装最新版的MySQL(mysql-installer-community-5.7.11.0.msi 下载地址)发现MySQL默认是安装在C盘,这个绝对不能忍,然后就到网上找教程,很少提及新版的地址选择问题,后来在贴吧中看到,其他的安装步骤不说了(参考:Windows下MySQL 5.6安装及配置详细图解 或者 MySql5.6Window超详细安装教程),重点就是地址选择:

【转】记录PHP、MySQL在高并发场景下产生的一次事故

看了一篇网友日志,感觉工作中值得借鉴,原文如下: 事故描述 在一次项目中,上线了一新功能之后,陆陆续续的有客服向我们反应,有用户的个别道具数量高达42亿,但是当时一直没有到证据表示这是,确实存在,并且直觉告诉我们,这是不可能的,就一直没有在意,直到后来真的发现了一个用户确实是42亿,当时我们整个公司都震惊了,如果有大量用户是这样的情况,公司要亏损几十万,我们的老大告诉我们,肯定是什么地方数据溢出的,最后我们一帮人,疯了似的查代码,发现…… 如果按照正常的程序逻辑走下去,代码是完全没问题,但是我发

面试问题总结

数据库篇 int类型用字符串类型查询是否会走索引 准备语句: 1 2 3 4 5 DROP TABLE ix_test; CREATE TABLE ix_test (id_1 varchar(20) NOT NULL, PRIMARY KEY(id_1)); INSERT INTO ix_test VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11); mysql会将数字在整形和字符串之间自动转换!这样下面两条语句的结果是一样的:SELECT

mysql中文坑爹的东西

1.首先pb需要utf8格式,所以由ansi转换成utf8格式才能传输 2.在接收端,需要将utf8转换成ansi才能用 3.在插入数据库之前需要将sql从ansi转换成utf8格式 4.数据库设置字符集为utf8 ASSERT( 0 == Query(&m_con, "SET NAMES utf8", strlen("SET NAMES utf8"))); db_user_mail* pMail = offline->mutable_user_mai

linux 环境下 mysql 导出CSV格式报表

一般情况下不会特意到linux系统上去使用mysql, 毕竟没有类似MysqlFront这样现成的操作工具.但是产品的线上服务器是linux服务器,没办法,只能硬着头皮码shell语句来操作了. 通用语句如下: mysql -u biadmin -h lbw-52xfj.mysql.rds.aliyuncs.com -p -e "你需要的sql语句" > 文件输出位置 -u 是mysql用户名, -h 是主机地址(如果是在本机上操作可以写 "localhost"

mysql中describe关键字

今天写代码的时候,有一个类的数据始终不能插入,老是提示在You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'describe, picPath1, picPath2, picPath3, picPath4, picPath5, agentId, belongStore' at li

windows mysql 安装及启动

0.下载: 图1 图2 图3 1.配置默认文件 其 实理论上现在这样就可以直接安装服务了, 但是因为是默认配置,我们使用的时候会出现很多问题.比如里面的汉字全是乱码之类的,所以建议你先配置一下默认文件.在mysql-x.x.xx- winx64(小编的是5.6.17根据自己的版本来定)目录下,新建个my.ini.复制下面的代码保存就ok了.my.ini会替换掉下面的my- default.ini文件..ini文件是window里面的配置文件.保存里面各种默认的数据.安装版的是在安装的时候让你自己

【转载】LINUX上MYSQL优化三板斧

现在MySQL运行的大部分环境都是在Linux上的,如何在Linux操作系统上根据MySQL进行优化,我们这里给出一些通用简单的策略.这些方法都有助于改进MySQL的性能. 闲话少说,进入正题. 一.CPU 首先从CPU说起. 你仔细检查的话,有些服务器上会有的一个有趣的现象:你cat /proc/cpuinfo时,会发现CPU的频率竟然跟它标称的频率不一样: #cat /proc/cpuinfo processor : 5 model name : Intel(R) Xeon(R) CPU E

mysql 5.7 版本 windows 安装

WIN10系统MYSQL的下载与安装详细教程,记录如下 前两天ubuntu下安装mysql遇到了一些依赖问题,结果解决了半天,没解决好,还把我的系统搞坏了,小白破坏力好强. 到现在我的ubuntu也没装好,电脑驱动的问题,联想小新310一装ubuntu,进去就卡,原来禁用原先的显卡驱动,可是第二次装系统,中间又搞了其他小动作,结果再装上系统后,禁用显卡驱动也不行了.只能先装win10用了,不料win10下安装Mysql又出现了问题,真是一波未平一波又起.解决了好长时间,所以写个博客记录一下吧.