Wide Li YY 2024-02-01 15:20 采纳率: 0%
浏览 11

插入Oracle数据库数据乱码

背景

使用的Java语言,springboot2.x;  
从一个数据库查数据(国产数据库,字符集utf-8),不做数据处理(使用的实体类接收);  
直接插入到Oracle数据,字符集ZHS16GBK;Oracle数据库服务器字符集:en_US.UTF-8 ; 因为一些原因数据库编码不可变 
应用服务器字符集:en_US.UTF-8;   
某字段数据特殊在有下标数字,WS₃-159....;
如果不做处理,入库后数据展示为问号;  
如果代码字符集处理则更不可言,乱中之乱
在navicat使用insert语句直接用带下标数据也是乱码,如果是在navicat中编辑格中直接粘贴数据是好的

在这里插入图片描述

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-01 15:23
    关注

    引自免费微信小程序:皆我百晓生

    在你提供的场景中,问题的根本原因在于从UTF-8编码的国产数据库查询数据,并尝试将其直接插入到字符集为ZHS16GBK的Oracle数据库中。由于这两种字符集不兼容,特别是对于包含特殊字符如下标数字的情况,如果没有进行适当的转码处理,就会导致乱码。

    解决方法:

    1. 转换字符集: 在Java代码中,你需要确保在读取和写入数据库时对字符串进行正确的编码转换。

      // 假设`dataFromSourceDb`是从源数据库获取的字符串
      String dataFromSourceDb = ...; // 这里是你的查询结果
      
      // 将UTF-8编码转换为ZHS16GBK编码
      String dataConvertedToGBK = new String(dataFromSourceDb.getBytes(StandardCharsets.UTF_8), StandardCharsets.GBK);
      
      // 然后使用转换后的字符串插入到Oracle数据库
      yourJdbcTemplate.update("INSERT INTO your_table (your_column) VALUES (?)", dataConvertedToGBK);
      
    2. 数据库连接配置: 虽然你提到数据库编码不可变,但在Spring Boot的Oracle数据库连接配置中,应确保驱动程序知道从应用服务器发送的数据是UTF-8格式,以及接收的数据需要解码为ZHS16GBK。例如,在application.properties或application.yml中:

      # application.properties
      spring.datasource.url=jdbc:oracle:thin:@your_host:your_port:your_service_name?characterEncoding=UTF8
      spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
      spring.datasource.username=your_username
      spring.datasource.password=your_password
      spring.jpa.properties.hibernate.connection.characterEncoding=UTF-8
      spring.jpa.properties.hibernate.connection.useUnicode=true
      
    3. Navicat中的乱码问题: Navicat中直接执行INSERT语句乱码可能是由于Navicat客户端自身的字符集设置与Oracle数据库不一致。检查并修改Navicat客户端的字符集设置以匹配Oracle数据库的实际环境。

    请注意,尽管以上方案可能解决了大部分乱码问题,但特殊的下标数字等非标准ASCII字符仍可能存在兼容性问题。如果在转换后仍然无法正确显示,可能需要查找特定于这些特殊字符的解决方案或者考虑在存储之前将它们转换为另一种可跨字符集表示的形式(例如HTML实体)。同时,更改数据库架构以支持更广泛字符集始终是最理想的解决方案,但由于你提到的原因目前无法实现。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月1日

悬赏问题

  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持