mysql 关键字冲突导致的sql执行错误

1,最近出现了一个很有意思的情况

我一共有三个数据库,开发,测试,正式,

分别放置在不同的服务器上

都是mysql数据库

2,这个时候出现了一个有意思的问题

我的sql如下


	SELECT count(0) FROM sys_log  WHERE system = 'system'
	

在开发和测试数据库上执行此sql,没有问题

但是在正式环境的数据库上执行此sql,就会报如下错误
在这里插入图片描述

3,纳闷了半天,确定就是关键字的问题

但是比对了三个数据库,确实又没找到不同点,问大佬,大佬太忙,也没细究

4,解决办法

方案1:修改字段名(推荐)

注意:但是千万不要用sql语句去改,因为语句中含有关键字,所以sql是不会执行成功的,所以只能去数据库管理工具中修改


ALTER table sys_log change system system1 varchar(255) CHARSET utf8 COLLATE utf8_general_ci NULL COMMENT '系统'

【修改字段的名称】


语法:

alter table <表名> change <字段名> <字段新名称> <字段的类型>

相关链接:https://www.cnblogs.com/sujulin/p/9021355.html

方案2:修改执行sql


SELECT count(0) FROM sys_log s  WHERE s.system = 'system'


或者


SELECT count(0) FROM sys_log  WHERE `system` = 'system'

5,其他相关

注意:当出现关键字的时候,然后业务层使用的sql借助了mybatis-plus框架写的,如


  public PageInfo<SysAuditLogDTO> selectAuditLog(ConditionDTO conditionDTO, Integer pageNum, Integer pageSize) {
        LambdaQueryWrapper<SysLogEntity> wrapper = Wrappers.<SysLogEntity>lambdaQuery()
                .orderByDesc(SysLogEntity::getCreateTime);
        if (StrUtil.isNotEmpty(conditionDTO.getSystem())) {
            wrapper.eq(SysLogEntity::getSystem, conditionDTO.getSystem());
        }
        if (conditionDTO.getStart() != null) {
            wrapper.ge(SysLogEntity::getCreateTime, conditionDTO.getStart());
        }
        if (conditionDTO.getFinish() != null) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(conditionDTO.getFinish());
            calendar.add(Calendar.DATE, 1);
            wrapper.le(SysLogEntity::getCreateTime, calendar.getTime());
        }
        Page<SysLogEntity> page = PageHelper.startPage(pageNum, pageSize).doSelectPage(() -> list(wrapper));
        return auditLogMapper.toDto(page.toPageInfo());
    }
//注:PageHelper是内部的一个工具类,对数据进行分页处理

有两种办法,

方案一:在xml文件中写sql

业务层调用:(中间省略了dao)


    public PageInfo<SysLogEntity > selectLog(ConditionDTO conditionDTO, Integer pageNum, Integer pageSize) {

        Page<SysLogEntity> page = PageHelper.startPage(pageNum, pageSize).doSelectPage(() -> sysLogDao.sysAuditLogListByQueryConditions(conditionDTO));
       
        return auditLogMapper.toDto(page.toPageInfo());
    }

mapper.xml文件


    <insert id="addOne">
        insert into sys_log (id, `system`)
        values (#{SysLogEntity.id},#{SysLogEntity.system});

    </insert>

方案二:实体类@TableField中添加 ``(推荐)

这样就支持mybatis-plus框架写法


@Data
@TableName("sys_log")
public class SysLogEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * id
     */
    @TableId
    private Long id;

    /**
     * 系统
     */
    @TableField("`SYSTEM`")
    private String system;
}

你可能感兴趣的:(那些年遇到的BUG,#,MySQL,sql,mysql,数据库)