oracle 11gR2全宽百分比登录like子句

oracle 11gR2全宽百分比登录like子句,oracle,Oracle,我在oracle的: 仅允许使用ASCII等效下划线(_)和百分比(%)字符 识别为模式匹配字符。它们的全宽变型, 存在于东亚字符集和Unicode中,被视为 正常字符 但奇怪的是,我的全宽百分号%与半宽%一样工作,下面是我的java代码: Class.forName( "oracle.jdbc.driver.OracleDriver" ); Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@******", "*

我在oracle的:

仅允许使用ASCII等效下划线(_)和百分比(%)字符 识别为模式匹配字符。它们的全宽变型, 存在于东亚字符集和Unicode中,被视为 正常字符

但奇怪的是,我的全宽百分号%与半宽%一样工作,下面是我的java代码:

Class.forName( "oracle.jdbc.driver.OracleDriver" );
Connection conn = DriverManager.getConnection( "jdbc:oracle:thin:@******", "***", "***" );
Statement stmt = conn.createStatement();
stmt.execute("select * from v$nls_parameters");
ResultSet rs = stmt.getResultSet();
while(rs.next()) {
    System.out.println(rs.getString(1) + ": " + rs.getString(2));
}
stmt.execute("select * from dual where '123' like '12%'");
rs = stmt.getResultSet();
while(rs.next()) {
    System.out.println(rs.getString(1));
}
输出为:

NLS_LANGUAGE: JAPANESE
NLS_TERRITORY: JAPAN
NLS_CURRENCY: ¥
NLS_ISO_CURRENCY: JAPAN
NLS_NUMERIC_CHARACTERS: .,
NLS_CALENDAR: GREGORIAN
NLS_DATE_FORMAT: RR-MM-DD
NLS_DATE_LANGUAGE: JAPANESE
NLS_CHARACTERSET: AL32UTF8
NLS_SORT: BINARY
NLS_TIME_FORMAT: HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT: RR-MM-DD HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT: HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT: RR-MM-DD HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY: \
NLS_NCHAR_CHARACTERSET: UTF8
NLS_COMP: BINARY
NLS_LENGTH_SEMANTICS: BYTE
NLS_NCHAR_CONV_EXCP: FALSE
X
但奇怪的是,在sqlplus中:

SQL> select * from dual where '123' like '12%';

no rows selected
而且,会话的nls参数现在不同了:

SQL> select * from v$nls_parameters;

PARAMETER                               VALUE
-------------------------------------   ----------------------------------------------------------------
NLS_LANGUAGE                            AMERICAN
NLS_TERRITORY                           AMERICA
NLS_CURRENCY                            $
NLS_ISO_CURRENCY                        AMERICA
NLS_NUMERIC_CHARACTERS                  .,
NLS_CALENDAR                            GREGORIAN
NLS_DATE_FORMAT                         DD-MON-RR
NLS_DATE_LANGUAGE                       AMERICAN
NLS_CHARACTERSET                        AL32UTF8
NLS_SORT                                BINARY
NLS_TIME_FORMAT                         HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT                    DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT                      HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT                 DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY                       $
NLS_NCHAR_CHARACTERSET                  UTF8
NLS_COMP                                BINARY
NLS_LENGTH_SEMANTICS                    BYTE
NLS_NCHAR_CONV_EXCP                     FALSE

19 rows selected.

非常感谢您提供的任何帮助。

我建议转义特殊字符%\uu(加上转义字符本身),如


选择*from dual,其中“123”类似于“12\%”escape“\”

如果“%”的翻译方式不同,那么在Java和SQLplus中执行此查询时会得到什么结果:从dual中选择dump(“%”);对不起,我刚才用的是半宽的变体。。。Java给出:Typ=96 Len=3:239188133。Sqlplus给出:Typ=96 Len=9:2391911892391189239191189189我认为1个字符永远不会是9长。很抱歉延迟回复,它确实是9长的…看起来像是一个由3个字节组成的重复组。239,191,189. 不知道如何从一个1字符的字符串中得到它。