xinrong2019 / xinrong2019.github.io

My Blog
https://xinrong2019.github.io
1 stars 1 forks source link

20190516之Oracle数据库国际化支持阿拉伯文、波斯文 #16

Open xinrong2019 opened 5 years ago

xinrong2019 commented 5 years ago

在值前面,引号前面加大写的N即可,存的时候表示用unicode编码存,查的时候表示用unicode解码查。

update KD_LANGUAGE l
set l.langtext = N'کد زبان'
where l.moduleid = 41
and l.MODULETEXT = '物料模块';

select * from Kd_Language l
where l.langtext = N'کد زبان'
xinrong2019 commented 5 years ago

上面的语句直接在PLSQL执行是没有问题的,但是在Mybatis中,如何使用?

首先试了下直接在原语句前面加N:

N#{langText,jdbcType=VARCHAR},

失败。

再尝试在Mybatis中将#换成$,因为$是字符串拼接:

$'{langText}',

可以存,不报错,但是存进去乱码,全是问号。

以关键字N brefore搜索官方文档,搜到一些东西:

Unicode String Literals

Unicode字符串字面

引用一下原文介绍:

Unicode String Literals You can input Unicode string literals in SQL and PL/SQL as follows:

Put a prefix N before a string literal that is enclosed with single quote marks. This explicitly indicates that the following string literal is an NCHAR string literal. For example, N'résumé' is an NCHAR string literal. For information about limitations of this method, see NCHAR String Literal Replacement.

大概意思,你可以使用N'résumé'在SQL和PL/SQL输入字符串字面值。N作为前缀,可以让后面的字面值作为NCHAR类型

SQL Functions for Unicode Datatypes

Example 7-1 Populating the Customers Table Using the TO_NCHAR Function

The TO_NCHAR function converts the data at run time, while the N function converts the data at compilation time.

INSERT INTO customers VALUES (1000, TO_NCHAR('John Smith'),N'500 Oracle Parkway',sysdate);

TO_NCHAR 是在运行时转换数据,N是在编译时转换数据。估计编译的时候有一个Unicode编解码的过程。

既然是编译时的字面量转换,那么mabytis中肯定只能使用${}了。

但是为什么还是乱码?

Google搜了一下how to use oracle N prefix in mybatis

第一条答案,这个老哥遇到的情况就和我的一模一样。

还需要在应用启动时加两个参数,支持NChar字面量:

-Doracle.jdbc.defaultNChar=true 
-Doracle.jdbc.convertNcharLiterals=true

总结一下:

1、Mybatis中参数设置使用$

$'{langText}',

2、需要设置两个JVM参数,来支持N的使用,使N生效。

-Doracle.jdbc.defaultNChar=true 
-Doracle.jdbc.convertNcharLiterals=true