【 使用环境 】生产环境
【 OB or 其他组件 】OB
【 使用版本 】4.3.3
【问题描述】mysql租户执行SQL,报错说该字段不存在数据库表中,但desc 表确实有改字段,在字段上加上双引号能正常查询,不加双引号就会报错,能否忽略掉这个双引号正常执行?
【复现路径】
第一张图是不加双引号
第二张图是加上双引号
【 使用环境 】生产环境
【 OB or 其他组件 】OB
【 使用版本 】4.3.3
【问题描述】mysql租户执行SQL,报错说该字段不存在数据库表中,但desc 表确实有改字段,在字段上加上双引号能正常查询,不加双引号就会报错,能否忽略掉这个双引号正常执行?
【复现路径】
第一张图是不加双引号
保存到文本里 整个语句提供一下
你好,OceanBase mysql租户兼容原生mysql引用规则,不加引号,默认小写,加了引号按大写识别,建议创建表和字段名时全小写
那只能是重建表了吗,可以改系统参数吗
该参数是租户参数, lower_case_table_names默认值为1,表示存储小写,且不区分大小写。
只能在创建租户时指定,创建租户后无法修改
我重建了表,建表语句把双引号都去掉了,还是会报错,该字段不存在
ob433是社区版么?提供一下日志 下面是步骤
如果 SQL 执行立刻报错的,推荐使用系统租户获取 trace_id。
a.登录系统租户,打开enable_rich_error_msg 参数
alter system set enable_rich_error_msg=true;
b.登录业务租户,执行报错 SQL 语句,会直接返回执行节点 IP 和 trace_id 信息。
obclient [test]> select count(*) from t2;
ERROR 1146 (42S02): Table ‘test.t2’ doesn’t exist
[xx.xx.xx.1:2882] [2024-04-13 20:10:20.292087] [YB420BA1CC68-000615A0A8EA5E38-0-0]
c.去 xx.xx.xx.1 节点过滤日志,如果最新日志无法过滤到,可以正则匹配多个日志进行过滤
[root@x.x.x.1 ~]$ grep “YB420BA1CC68-000615A0A8EA5E38-0-0” rootservice.log
[root@x.x.x.1 ~]$ grep “YB420BA1CC68-000615A0A8EA5E38-0-0” observer.log
d.获取完日志信息后,关闭enable_rich_error_msg参数
alter system set enable_rich_error_msg=false;
ob 4.3.3 是社区版,具体版本是5.7.25-OceanBase_CE-v4.3.3.1;rootservice.log查不到日志, observer.log可以查到,麻烦帮忙看看。
observer.log_02271019.txt (13.3 KB)
SELECT left(t2.DEPT_ADRRESSCODE, 4)
FROM wstjfx.HZ_NB_YY t2
GROUP BY left(t2.DEPT_ADRRESSCODE,4)
HAVING “left(t2.DEPT_ADRRESSCODE,4)” is NOT NULL
加上双引号就能正常查询,重建过表把字段改成没有反引号的查询也不行
加上反引号 其实就是忽略大小写 默认就变成小写了
那如果要直接引用呢?不加双引号或反引号
主要是感觉你这个HAVING “left(t2.DEPT_ADRRESSCODE,4)”好奇怪
SELECT left(t2.DEPT_ADRRESSCODE, 4) as v_DEPT_ADRRESSCODE
FROM wstjfx.HZ_NB_YY t2
GROUP BY left(t2.DEPT_ADRRESSCODE,4)
HAVING v_DEPT_ADRRESSCODE is NOT NULL
改一下语句 用别名试一下
用别名是可以 那最上面那个什么都不加为啥不行呀 是不是ob产品问题呀
不是 你使用的不合符HAVING 标准用法
那加上双引号又行 整不会了
以后注意就行 尽量不要非标操作就行了 加了双引号是一个整体 相当于是一个整体字符串这样
还有个问题,就是这个字段跟其他表左连接也是报列不存在。