案例背景
某省BOMC系统
环境描述
OS:bclinux for euler 21.10
数据库版本:S3.1.1_B01
兼容模式:A
数据库架构:集中式主备
描述
业务反馈在使用磐维数据库时,查询结果返回的列名都是小写,而在Oracle环境中查询的时候,返回结果都是大写,需要保持和Oracle一致。


从上图可以看出用别名或者原名都是返回小写的;
但是业务反馈,代码里之前默认取大写列名,直接就空指针了:


分析
查看数据库兼容模式及lower_case_column_names参数:

在磐维数据库中,查询返回结果中列名的大小写由参数uppercase_attribute_name或result_case_mode决定,uppercase_attribute_name控制列名是否以大写形式返回给客户端,默认为off;
而result_case_mode仅影响返回字段的大小写形式,不影响数据库原有的大小写匹配逻辑,且该参数仅作用于会话级别,在postgresql.conf文件中配置无效,默认值是lower;
这两个参数只作用于Oracle(A)兼容模式和集中式环境中;
lower_case_column_names参数只作用于MySQL(B)兼容模式中。
A模式测试1,会话开启result_case_mode:

A模式测试2,开启uppercase_attribute_name:

B模式测试1,开启uppercase_attribute_name:

B模式测试2,开启result_case_mode:

A/B模式下测试,对于加引号的别名都是区分大小写的:


经测试,目前磐维查询结果列名大小写由uppercase_attribute_name或result_case_mode控制,且智能在A模式中使用,通过别名加双引号的方式在A、B模式中均可实现大小写区分。
结论
A模式中设置uppercase_attribute_name参数为on,或者会话中设置result_case_mode参数为upper,或者别名加双引号的方式,都可以实现查询返回列名大写。
实践方法
1. uppercase_attribute_name参数设置
gs_guc reload -N all -I all -c “uppercase_attribute_name=on”;
2. result_case_mode参数设置
在数据库会话中执行:set result_case_mode to upper




