mysql 5.7 sql_mode/date 类型0000-00-00不能插入

在MySQL 5.7中,由于sql_mode设置,如ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES等,可能导致含有0000-00-00日期的记录无法插入。解决方法包括查看并修改sql_mode值,特别是移除ONLY_FULL_GROUP_BY,以允许对已有数据库进行插入操作。同时解释了不同sql_mode选项的含义,例如NO_ZERO_IN_DATE和NO_ZERO_DATE会阻止插入包含零日期的记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接

https://blog.youkuaiyun.com/qq_34567646/article/details/81665972

1、查看sql_mode

select @@sql_mode

 

2、去掉ONLY_FULL_GROUP_BY,重新设置值。

set @@sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

 

3、上面是改变了全局sql_mode,对于新建的数据库有效。对于已存在的数据库,则需要在对应的数据下执行:

set sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

 

二、sql_mode值的含义:

ONLY_FULL_GROUP_BY:

对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么将认为这个SQL是不合法的,因为列不在GROUP BY从句中

 

STRICT_TRANS_TABLES:

在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做任何限制

 

NO_ZERO_IN_DATE:

在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入'0000-00-00'。在非严格模式,可以接受该日期,但会生成警告。

 

NO_ZERO_DATE:

在严格模式,不要将 '0000-00-00'做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告

 

ERROR_FOR_DIVISION_BY_ZERO:

在严格模式,在INSERT或UPDATE过程中,如果被零除(或MOD(X,0)),则产生错误(否则为警告)。如果未给出该模式,被零除时MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作结果为NULL。

 

NO_AUTO_CREATE_USER

防止GRANT自动创建新用户,除非还指定了密码。

 

NO_ENGINE_SUBSTITUTION:

如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常

<think>好的,我现在需要帮助用户了解如何初始化MySQL数据库以及配置my.cnf文件,特别是添加指定的参数。首先,我应该回忆一下MySQL初始化的基本步骤和相关配置文件的设置。 首先,初始化MySQL数据库通常是在安装完成后进行的步骤,特别是当使用某些包管理器安装或者从源代码编译时。用户可能使用的是Linux系统,比如Ubuntu或者CentOS。初始化过程可能涉及使用mysqld --initialize或mysql_install_db命令,这取决于MySQL的版本。例如,MySQL 5.7及以上版本使用mysqld --initialize,而旧版本可能使用mysql_install_db。需要注意数据目录的权限设置,确保mysql用户有权限访问。 接下来是配置my.cnf文件。这个文件的位置可能在/etc/my.cnf、/etc/mysql/my.cnf,或者不同的发行版可能有不同的路径。用户提到的参数包括tmp_table_size、max_connections、character_set_server、sql_mode和skip-name-resolve。我需要逐一解释这些参数的作用和推荐值。 tmp_table_size控制临时表的大小,如果超过这个值,临时表会转为磁盘存储。需要根据服务器的内存情况来设置,避免过大导致内存不足。max_connections是最大连接数,默认是151,但可能需要根据应用需求调整,同时要注意关联的thread_cache_size和open_files_limit的设置。character_set_server设置默认字符集,通常建议使用utf8mb4以支持更广泛的字符。sql_mode定义MySQLSQL语法和校验规则,比如严格模式可以防止不正确的数据插入。skip-name-resolve可以禁用DNS反向解析,加快连接速度,但可能影响权限设置中的主机名使用。 在编写配置示例时,需要将这些参数正确放置在my.cnf的相应部分,比如[mysqld]下。同时,要提醒用户在修改配置后重启MySQL服务使设置生效,如使用systemctl restart mysqld或service mysql restart。 另外,用户提供的引用中有提到myisam_max_sort_file_size、table_open_cache、slow_query_log_file等参数,虽然用户没有直接询问这些,但可能在配置时需要考虑其他相关优化参数。不过用户的问题主要集中在特定的参数上,所以可能需要保持答案的针对性。 还需要注意用户可能遇到的问题,比如初始化过程中的权限错误,或者配置参数错误导致MySQL无法启动。这时候可以建议查看错误日志来排查问题,通常是/var/log/mysql/error.log或数据目录下的日志文件。 最后,生成相关问题时要围绕初始化和配置展开,比如初始化步骤、参数优化、常见问题解决等。确保问题能够帮助用户深入理解相关操作和配置的影响。</think>### MySQL数据库初始化与my.cnf配置指南 #### 一、初始化MySQL数据库 1. **初始化命令** - 对于MySQL 5.7及以上版本: ```bash mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/var/lib/mysql ``` 初始化后会在日志中生成临时密码,路径通常为`/var/log/mysqld.log`[^2]。 - 旧版本(如5.6)使用: ```bash mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/var/lib/mysql ``` 2. **权限设置** 确保数据目录权限正确: ```bash chown -R mysql:mysql /var/lib/mysql ``` --- #### 二、配置my.cnf文件 1. **文件路径** - 默认路径:`/etc/my.cnf` 或 `/etc/mysql/my.cnf` - 自定义路径需通过启动参数`--defaults-file`指定。 2. **关键参数配置示例** ```ini [mysqld] # 临时表内存限制(默认16MB) tmp_table_size = 64M # 最大连接数(默认151) max_connections = 300 # 默认字符集 character_set_server = utf8mb4 # SQL模式(严格模式+兼容性配置) sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION # 跳过域名解析(提升连接速度) skip-name-resolve # 其他推荐参数 table_open_cache = 2000 # 默认64,需根据表数量调整[^3] slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log # 慢查询日志路径[^4] ``` 3. **参数说明** - `tmp_table_size`: 控制内存临时表上限,超过则转为磁盘存储。需与`max_heap_table_size`配合使用。 - `max_connections`: 需结合`thread_cache_size`和`open_files_limit`调整[^3]。 - `skip-name-resolve`: 禁用DNS反向解析,但授权表中需用IP而非主机名[^4]。 --- #### 三、生效配置 1. **重启MySQL服务** ```bash systemctl restart mysqld # 或 service mysql restart ``` 2. **验证参数** 登录MySQL后执行: ```sql SHOW VARIABLES LIKE 'tmp_table_size'; SHOW VARIABLES LIKE 'max_connections'; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值