MySQL数据库切换瀚高数据库(PostgreSQL)导致SQL适配问题:BadSqlGrammarException

温馨提示:

下面的出现的情况属于层层递进 的,如果只解决其中一种情况会接着报下一个情况,如果只想了解解决方案请直接移步至结论

1. 情况一:ERROR: operator does not exist: smallint = character varying

  1. 报错详细描述:
  1. 产生原因:

在SQL查询中尝试执行了一个不被支持的数据类型比较操作。

  1. 解决方案:

在application.yaml文件中,在url后加&stringtype=unspecified,例如:

XML 复制代码
spring:
  datasource:
    driver-class-name: com.highgo.jdbc.Driver
    url: jdbc:highgo://localhost:5866/highgo?currentSchema=demo&stringtype=unspecified
    username: root
    password: root

2. 情况二:ERROR: could not determine data type of parameter $5

  1. 报错详细描述:
  1. 产生原因:

常常发生在模糊匹配上。在执行参数化查询时,数据库无法识别或推断出传入参数的具体数据类型。

  1. 解决方案:

需要在注入的值后加::数据类型。例如要模糊匹配varchar类型的name:

原sql语句为:

sql 复制代码
SELECT * FROM demo WHERE name LIKE CONCAT('%',#{keyword},'%');

修改后sql语句为:

sql 复制代码
SELECT * FROM demo WHERE name LIKE CONCAT('%',#{keyword}::text,'%');

或者可以修改为:

sql 复制代码
SELECT * FROM demo WHERE name LIKE CONCAT('%',#{keyword}::varchar,'%');

3. 情况三:ERROR: could not determine data type of parameter $1

  1. 产生场景:

在本地运行时,sql可以正常运行。在部署后,测试sql会报出该错误。一般发生在模糊匹配。

  1. 产生原因:

a. 在执行参数化查询时,数据库无法识别参数$1的确切数据类型。

b. 本地开发环境与生产环境的配置不同。

  1. 解决方案

在模糊匹配后加 ESCAPE '/' ,如:

原sql语句:

sql 复制代码
SELECT * FROM demo WHERE name LIKE CONCAT('%',#{keyword}::varchar,'%');

修改后sql语句:

sql 复制代码
SELECT * FROM demo WHERE name LIKE CONCAT('%',#{keyword}::varchar,'%') ESCAPE '/';

4. 结论:

第一步,修改appliction.yaml。在application.yaml文件中,在url后加&stringtype=unspecified,例如:

XML 复制代码
spring:
  datasource:
    driver-class-name: com.highgo.jdbc.Driver
    url: jdbc:highgo://localhost:5866/highgo?currentSchema=demo&stringtype=unspecified
    username: root
    password: root

第二步,修改sql语句。模糊匹配位置 ,将填充的值指定数据类型,并在CONCAT函数后加 ESCAPE '/'。如:

原sql语句:

sql 复制代码
SELECT * FROM demo WHERE name LIKE CONCAT('%',#{keyword},'%');

修改后sql语句为:

sql 复制代码
SELECT * FROM demo WHERE name LIKE CONCAT('%',#{keyword}::varchar,'%') ESCAPE '/';

或:

sql 复制代码
SELECT * FROM demo WHERE name LIKE CONCAT('%',#{keyword}::text,'%') ESCAPE '/';
相关推荐
starzy19908 小时前
Flink Sliding Window 详解及代码实现:从窗口重叠到状态爆炸防控
运维·数据库·flink
jnrjian9 小时前
DRG-50857 ORA-30576 drixmd.PurgeKGL CTXSYS
数据库·oracle
志栋智能10 小时前
集成是关键:让巡检超自动化融入现有工具链
运维·服务器·数据库·架构·自动化
IvorySQL10 小时前
PostgreSQL 日报|逻辑解码竞态条件修复(9 月 20 日)
数据库·人工智能·postgresql
想念是会呼吸的鱼10 小时前
【ClickHouse 常用 SQL 语句整理】
sql·clickhouse
爱奥尼欧10 小时前
【MySQL】建库就是建目录?字符集校验规则、备份恢复与alter改表实操
mysql
大虾别跑10 小时前
mysql5.7升级
mysql
adinnet202611 小时前
为什么 RAG 需要 Milvus?向量数据库到底存了什么
大数据·数据库
geovindu11 小时前
sql: Transaction & Concurrency Patterns using mysql 9.0
mysql·数据库开发·数据库架构
Elastic 中国社区官方博客11 小时前
使用 Elasticsearch 和 Jina 进行 AI 视频搜索:精准找到你需要的视频片段秒数
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索