一、背景
药品销售系统数据库采用SpringBoot + Mybatis-Plus + Oracle实现
二、问题
系统开发完成上线后,客户提出查询出现大写的集团名称可以查询到,小些名称查询不到,希望不要区分大小写
三、问题分析
由于查询逻辑比较复杂,首先考虑是不是数据库改个配置就好了,搜索了一圈,好多方案,某度置顶的AI出的基本都不靠谱,ChatGPT出了一个额外的方案,或者说不同的做法
1、业务逻辑SQL不想改
怕出问题,或者说怕该漏了,而且用不到索引了,都是Lower(xxx) = Lower('')
2、改数据库全局配置
试了下不行,也不熟配置修改,或者说很麻烦
ALTER SYSTEM SET NLS_COMP = LINGUISTIC SCOPE=BOTH;
3、修改SESSION使用如下两句也可以,能解决问题:
ALTER SESSION SET NLS_COMP = LINGUISTIC; -- 使比较不区分大小写和重音符号等
ALTER SESSION SET NLS_SORT = BINARY_CI; -- 使排序不区分大小写和重音符号等
3.1、试图改Java代码
增加拦截器,配置新的sqlSession,@before注解什么的,不熟折腾了半天报错,白忙活了
3.2、chatGPT的法子比较适合
亖、问题的问题--标识符错误
将ChatGPT给的配置代码改成yaml配置,如下所示,启动系统,报错“标识符错误”
spring:datasource:druid:connection-init-sqls: ALTER SESSION SET NLS_SORT = BINARY_CI;ALTER SESSION SET NLS_COMP = LINGUISTIC;
PL/SQL Developer 中将代码方成一行,确实报错
分成两行就没错
五、问题的问题的问题--配置换行
于是问题目标改为解决新问题的新方向:
试了下全部不行,怎么配置都不对
六、柳暗花明
这个配置方式给了新提示,修改一下,搞定!说了半天就这点有用😄😄
spring:datasource:druid:connection-init-sqls: - ALTER SESSION SET NLS_SORT = BINARY_CI- ALTER SESSION SET NLS_COMP = LINGUISTIC
最终,只是修改了一下配置,重新启动一下服务端,基本解决了这个ORACLE查询区分大小写的问题。
意见建议:v 13316098767