`

Oracle中varchar2字段的不可见字符处理

阅读更多
在以前的项目中,曾经出现加密后的字符串数据丢失,加密内容无法正常解密的情况,经查找原因,发现是数据库表的varchar2字段中有chr(0)的不可见字符(即我们通常所说的\0),当出现这种情况时,由于java和c++中对字符串处理的不同,将会导致所取得的字符串长度不同。在java中,字符串的长度可以通过取字符串的字节数组来获得,这样得到的字符串长度为字符串实际的大小(汉字2个字节,其他1个字节);在c++中通过strlen函数获得的字符串长度为第一个字节\0之前的字符长度。

   当我们在编写jni的时候,经常会遇到将java的字符串转换为c++中的字符串的情况,这样,当java中的字符串包含\0的空字节时,在对c++转换后的字符串求取长度时,不要使用strlen函数,否则,其仅仅对\0字节之前的内容求取长度,与实际大小不同。



解决该类问题,根据所属应用的不同,可通过三种手段解决:



在数据库层解决:

       Oracle数据库中,可在查询语句中使用函数replace来去除字符串中的非可见字符,例如:

select replace(content,chr(0),null) from bossquery_request  where sky_command = '02';

   以后大家如果遇到类似情况,可通过replace(字段名,chr(ASCII码值),null)来去掉其中对应的ASCII码值的字符。

在java程序中解决:

   在java程序中,大家可通过获取String对象的所有字节内容,对字节内容进行扫描,来去掉其中不需要的字节。

在JNI层解决:
   在JNI层解决该问题的方式是,不要使用strlen函数来获取字符串长度,可通过GetArrayLength取字节数组长度函数或者其他类似函数来获取字符串长度,则可避免该情况发生。
分享到:
评论

相关推荐

    oracle中varchar2(byte)和varchar2(char).doc

    在Oracle数据库中,`VARCHAR2`是最常用的字符数据类型之一,用于存储变长的字符串。然而,在定义`VARCHAR2`类型时,可以选择指定长度为`BYTE`或`CHAR`。这两种方式看似细微的差别,实际上却对数据存储、性能优化以及...

    GP数据库表结构转mysql库、oracle库 varchar类型字段长度批量处理excel_MYSQL_oracle_数据库

    对于varchar字段,可能需要在转换前对源数据进行分析,确定实际的最大长度,然后在MySQL中设置合适的varchar长度,以平衡存储效率和数据完整性。 文件“mpp数据库长度转换.xls”很可能包含了一个表格,列出了源...

    ORACLE中CLOB字段转String类型

    本文将详细介绍如何在Oracle中实现CLOB字段到字符串类型的转换,并探讨其中的关键技术和注意事项。 #### 一、CLOB概述 1. **定义**: - `CLOB`是Oracle数据库提供的一种特殊的数据类型,用于存储大文本数据。 - ...

    浅析Oracle中char和varchar2的区别 电脑资料.docx

    例如,如果我们存储一个字符 'a' 到 char(10) 字段中,实际上占用的空间是 10 个字符,而如果我们存储同样的字符到 varchar2(10) 字段中,实际上占用的空间只是 1 个字符(或 2 个字符,如果是中文)。这说明 ...

    oracle char,varchar,varchar2的区别和使用方法

    - **定义**:`VARCHAR` 类型在 Oracle 中实际上等同于 `VARCHAR2` 类型,是一个可变长度的字符类型。 - **示例**:如果创建了一个 `VARCHAR2(20)` 类型的字段,并插入 "abc",那么只占用 3 个字符的空间(而不是 20...

    Oracle接收长度大于4000的字符串

    在Oracle数据库中,默认情况下,`VARCHAR2`类型字段的最大长度为4000个字符。当需要处理更长的字符串时(例如,超过4000个字符),可以采用多种方法来解决这一问题。本文将详细介绍如何在.NET环境中处理和传递长度...

    解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    在大多数情况下,varchar2类型是更好的选择,因为它可以存储变长字符串,而char类型只能存储固定长度的字符串。 在使用jdbc查询时,也需要注意char类型字段的特殊性。例如,使用PreparedStatement方式查询数据时,...

    oracle中读取blob字段.doc

    ### Oracle中BLOB字段的读取与操作 #### 一、引言 在数据库系统中,BLOB(Binary Large Object)是一种用于存储大量二进制数据的数据类型,例如图像、音频或视频文件等。在Oracle数据库中,BLOB类型特别适用于处理...

    Oracle JSON 字符串处理实例

    在Oracle中,处理JSON字符串涉及到解析、查询、更新和存储JSON数据。本篇文章将深入探讨Oracle对JSON字符串的处理实例。 首先,Oracle 12c及更高版本引入了JSON相关的数据类型和函数,如`JSON_OBJECT`和`JSON_ARRAY...

    oracle字段类型转换的处理

    在Oracle数据库中,字段类型转换是一项常见的操作,特别是在数据迁移、数据清洗或处理来自不同数据源的数据时。本文将深入探讨Oracle字段类型的转换方法,并提供一个实用的工具示例。 Oracle数据库支持多种数据类型...

    oracle替换wm_concat varchar处理为clob处理的方法

    是处理wm_concat中以varchar处理合并列字段过小。 clob 可以加大处理。 oracle 9I oracle 10G 必备

    ORACLE存储过程判断非法字符

    本话题将深入探讨如何在Oracle存储过程中检查和处理非法字符。 首先,我们需要明确什么是非法字符。在数据库上下文中,非法字符通常指的是那些可能导致SQL注入、数据格式错误或者不符合数据库字段定义的字符,如单...

    Oracle查询指定表的所有字段名和数据类型SQL

    在Oracle数据库管理中,有时我们需要了解某个特定表的所有字段名称以及它们对应的数据类型等信息。这对于理解表结构、进行数据迁移或编写更为精确的SQL语句非常有帮助。下面将详细介绍如何通过SQL查询来获取这些信息...

    浅析Oracle中char和varchar2的区别

    然而,由于`VARCHAR2`的变长特性,Oracle在处理`VARCHAR2`字段时需要额外进行语法分析,以确定每个字段的确切长度,这可能导致查询速度略慢于`CHAR`类型。 在大数据量的环境中,`VARCHAR2`通常更受欢迎,因为它能更...

    oracle数据库中的对表中字段的增删改查

    在Oracle数据库中,对表中字段的增删改查是数据库管理的基础操作,涉及到数据库设计、数据完整性以及日常的数据维护工作。以下将详细介绍这四个基本操作,并结合标签“源码”和“工具”来探讨如何在实践中高效地完成...

    将长于4000字符的字符串转化为CLOB类型存入数据库

    相比于VARCHAR2类型的4000字符限制,CLOB提供了更灵活、更强大的文本数据存储能力。 ### 二、转换字符串为CLOB类型的方法 #### 1. **使用Oracle.NET接口** 在C#中操作Oracle数据库通常会用到Oracle.NET接口,...

    Oracle与DB2数据类型分类对应说明

    但是,Oracle 中的 VARCHAR2(n)类型仅用于存放较小的字符串,因此,在实际应用中,我们需要根据实际情况选择合适的字符串类型。例如,在 DB2/400 中,我们可以使用定长的 CHAR(N)类型与 Oracle 的 VARCHAR2(n)...

    函数进行BLOB转换Varchar2.txt

    Oracle SQL 函数进行BLOB转换Varchar2

    Oracle数据库字段类型详解

    此外,`VARCHAR2` 把所有字符都按双字节处理(除了特定情况外),而`VARCHAR` 只对汉字和其他全角字符按双字节处理。`VARCHAR2` 还有一个特性,即把空串视为`NULL` 处理,而`VARCHAR` 仍然将其当作空串处理。因此,...

Global site tag (gtag.js) - Google Analytics