mysql字段名和关键字冲突的问题
作者:抱起我的猫去旅行
这篇文章主要介绍了mysql字段名和关键字冲突的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
mysql字段名和关键字冲突
1.用"(`)"将有冲突的字段框起来,键盘上1边上那个键。
例:
SELECT * FROM yun_roleright WHERE right LIKE '%{13}%';上面sql语句中right字段名与关键字冲突,会报错,,,应改成下面:
SELECT * FROM yun_roleright WHERE `right` LIKE '%{13}%';mysql关键字冲突导致的sql执行错误
最近出现了一个很有意思的情况
我一共有三个数据库,开发,测试,正式,
分别放置在不同的服务器上
都是mysql数据库
这个时候出现了一个有意思的问题
我的sql如下
SELECT count(0) FROM sys_log WHERE system = 'system'
在开发和测试数据库上执行此sql,没有问题
但是在正式环境的数据库上执行此sql,就会报如下错误

纳闷了半天,确定就是关键字的问题
但是比对了三个数据库,确实又没找到不同点,问大佬,大佬太忙,也没细究
解决办法
方案1:修改字段名(推荐)
注意:但是千万不要用sql语句去改,因为语句中含有关键字,所以sql是不会执行成功的,所以只能去数据库管理工具中修改
ALTER table sys_log change system system1 varchar(255) CHARSET utf8 COLLATE utf8_general_ci NULL COMMENT '系统'
【修改字段的名称】
语法: alter table <表名> change <字段名> <字段新名称> <字段的类型>。
方案2:修改执行sql
SELECT count(0) FROM sys_log s WHERE s.system = 'system'
或者
SELECT count(0) FROM sys_log WHERE `system` = 'system'
其他相关
注意:当出现关键字的时候,然后业务层使用的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;
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
