mysql租户能否忽略双引号列

【 使用环境 】生产环境
【 OB or 其他组件 】OB
【 使用版本 】4.3.3
【问题描述】mysql租户执行SQL,报错说该字段不存在数据库表中,但desc 表确实有改字段,在字段上加上双引号能正常查询,不加双引号就会报错,能否忽略掉这个双引号正常执行?
【复现路径】
第一张图是不加双引号


第二张图是加上双引号

1 个赞

保存到文本里 整个语句提供一下

你好,OceanBase mysql租户兼容原生mysql引用规则,不加引号,默认小写,加了引号按大写识别,建议创建表和字段名时全小写

cx.txt (52.5 KB)

你好,麻烦帮忙看看

那只能是重建表了吗,可以改系统参数吗

该参数是租户参数, 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
看着报错信息 引用了不存在的列报错 所有的表结构能提供一下么?保存在文本里 具体看那一下 我们也测试一下

表结构.txt (38.8 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 标准用法

那加上双引号又行 整不会了

以后注意就行 尽量不要非标操作就行了 加了双引号是一个整体 相当于是一个整体字符串这样

还有个问题,就是这个字段跟其他表左连接也是报列不存在。