九个MySQL数据库经典错误( 三 )


看下实验演练:
首先先创建一张表;
CREATE TABLE `t` ( `a` int(11) NOT NULL AUTO_INCREMENT, `b` varchar(20) DEFAULT NULL, PRIMARY KEY (`a`), KEY `b` (`b`)) ENGINE=InnoDB AUTO_INCREMENT=300 DEFAULT CHARSET=utf8插入三条数据:
mysql> insert into t (b) values ('aa');Query OK, 1 row affected (0.00 sec)mysql> insert into t (b) values ('bb');Query OK, 1 row affected (0.00 sec)mysql> insert into t (b) values ('cc');Query OK, 1 row affected (0.00 sec)mysql> select * from t;+-----+------+| a | b |+-----+------+| 300 | aa || 301 | bb || 302 | cc |+-----+------+3 rows in set (0.00 sec)先用 delete 进行删除全表信息 , 再插入新值 。
结果发现 truncate 把自增初始值重置了 , 自增属性从1开始记录了 。当前端用主键id进行查询时 , 就会报没有这条数据的错误 。
个人建议不要使用 truncate 对表进行删除操作 , 虽然可以回收表空间 , 但是会涉及自增属性问题 。这些坑 , 我们不要轻易钻进去 。
Top 6:
阿里云 MySQL 的配置文件中 , 需要注意一个参数设置就是:
lower_case_table_names = 0;默认情况
lower_case_table_names = 1;是不区分大小写 . 如果报你小写的表名找不到, 那你就把远端数据库的表名改成小写 , 反之亦然 . 注意 Mybatis 的 MApper 文件的所有表名也要相应修改
Top 7:
有同学经常会问张老师 , 为什么我的数据库总会出现中文乱码的情况 。一堆????不知道怎么回事 。当向数据库中写入创建表 , 并插入中文时 , 会出现这种问题 。此报错会涉及数据库字符集的问题 。
解决思路:
对于中文乱码的情况 , 记住老师告诉你的三个统一就可以 。还要知道在目前的mysql数据库中字符集编码都是默认的UTF8
处理办法:
1、数据终端 , 也就是我们连接数据库的工具设置为 utf8
2、操作系统层面;可以通过 cat /etc/sysconfig/i18n 查看;也要设置为 utf8
3、数据库层面;在参数文件中的 mysqld 下 , 加入 character-set-server=utf8 。
Emoji 表情符号录入 mysql 数据库中报错 。
Caused by: JAVA.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x97\xF0\x9F...' for column 'CONTENT' at row 1at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1379)解决思路:针对表情插入的问题 , 一定还是字符集的问题 。
处理方法:我们可以直接在参数文件中 , 加入
vim /etc/my.cnf
[mysqld]
init-connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
注:utf8mb4 是 utf8 的超集 。
Top 8:使用 binlog_format=statement 这种格式 , 跨库操作 , 导致从库丢失数据 , 用户访问导致出现错误数据信息 。
当前数据库二进制日志的格式为:binlog_format=statement
在主库设置binlog-do-db=mydb1(只同步mydb1这一个库)
在主库执行use mydb2;
insert into mydb1.t1 values ('bb');这条语句不会同步到从库 。
但是这样操作就可以;
use mydb1;
insert into mydb1.t1 values ('bb');因为这是在同一个库中完成的操作 。
在生产环境中建议使用binlog的格式为row , 而且慎用binlog-do-db参数 。
【九个MySQL数据库经典错误】Top 9:MySQL 数据库连接超时的报错 ;
org.hibernate.util.JDBCExceptionReporter - SQL Error:0, SQLState: 08S01org.hibernate.util.JDBCExceptionReporter - The last packet successfully received from the server was43200 milliseconds ago.The last packet sent successfully to the server was 43200 milliseconds ago, which is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection 'autoReconnect=true' to avoid this problem.org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with sessionorg.hibernate.exception.JDBCConnectionException: Could not execute JDBC batch updatecom.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Connection.close() has already been called. Invalid operation in this state.org.hibernate.util.JDBCExceptionReporter - SQL Error:0, SQLState: 08003org.hibernate.util.JDBCExceptionReporter - No operations allowed after connection closed. Connection was implicitly closed due to underlying exception/error: ** BEGIN NESTED EXCEPTION **


推荐阅读