以前面mer_categ为例,修改表结构如下:

字段

数据类型

长度

说明

S_merc_id

Varchar2

20

分类编号

S_merc_name

NVarchar2

50

分类名称

环境参数:

数据库字符集:ZHS16GBK

数据库国家字符集:AL16UTF16

NLS_LANG:ZHS16GBK

测试:

Insert into mer_catag values

(‘01’,’삼성’);

验证一下:select dump(s_merc_name,16) from

mer_categ

结果是:Typ=1 Len=4:

ff,1f,ff,1f

“ff,1f”是全角“?”在UTF-16字符集中的编码,怎么写了两个“?”进去?

查阅官方资料:

You can input Unicode string literals in SQL and PL/SQL as

follows:

Put a prefixNbefore a string literal that is enclosed with

single quote marks. This explicitly indicates that the following

string literal is anNCHARstring literal. For example,N'résumé'is anNCHARstring literal…..

按照官方的说法,在字符串前面加“N”即代表“N”后面跟着的单引号内的字符串是NCHAR字符串。NCHAR字符串是什么?NCHAR意味着字符串将使用数据库的国家字符集进行编码。测试:

Insert into mer_catag values (‘01’,N’삼성’);

验证一下:select dump(s_merc_name,16) from

mer_categ

结果是:Typ=1 Len=4: ff,1f,ff,1f

结果显示数据库存了两个全角大“?”。Why?

前面引用到:

SQL语句提交到Server之前,SQL语句中的字符串部分(不管前面有没有N’)作为语句的一部分将被用NLS_LANG定义的字符集进行编码。

原来在客户端NCHAR字符串(N’삼성’)就被GBK字符集转换了,传到server端的是两个全角“?”。那将客户端NLS_LANG改为AL32UTF8:

数据库字符集:ZHS16GBK

数据库国家字符集:AL16UTF16

NLS_LANG:AL32UTF8

测试:

Insert into mer_catag values (‘01’,N’삼성’);

验证一下:select dump(s_merc_name,16) from

mer_categ

结果是:Typ=1 Len=4: ff,1f,ff,1f

结果显示数据库还是存了两个全角“?”。

再看文档:

When the SQL or

PL/SQL statement is transferred from client to the database server,

its character set is converted accordingly.It is important to note that if the

database character set does not contain all characters used in the

text literals, then the data is lost in this

conversion.This problem

affectsNCHARstring literals more than

theCHARtext literals. This is

because theN'literals are designed to be independent

of the database character set, and should be able to provide any

data that the client character set supports.

难道让我再改数据库字符集为UTF8?!

To avoid data loss

in conversion to an incompatible database character set, you can

activatetheNCHARliteral replacement

functionality. The

functionality transparently replaces

theN'literals on the client side with

aninternalformat. The database server then decodes

this to Unicode when the statement is executed.

还真复杂,那如何实现NCHARliteral

replacement?

you can set the client environment

variableORA_NCHAR_LITERAL_REPLACEtoTRUEto control the functionality

按他说的办,setORA_NCHAR_LITERAL_REPLACE =TRUE

再测:

Insert into mer_catag values

(‘01’,N’삼성’);

验证一下:select dump(s_merc_name,16) from

mer_categ

结果是:Typ=1 Len=4:

c0,bc,c1,31

终于成功了!字符串:N’삼성’被替换成什么样的internal format,数据库又怎么将其解码成Unicode,我们不得而知,只是按照官方的方法去做将多国文字正确地写入数据库中。这时的环境参数是:

服务器端:

数据库字符集:ZHS16GBK

数据库国家字符集:AL16UTF16

客户端:

NLS_LANG:AL32UTF8

环境变量:ORA_NCHAR_LITERAL_REPLACE =TRUE

这样的字符集设置,改变了客户端NLS_LANG与环境变量。如果不改变任何默认设置,比如客户端NLS_LANG仍然是ZHS16GBK,也不要什么环境变量设置,那可以实现多国文字的正确存储吗?如果你使用VB.NET开发,试试下面的代码:

………………

DimconnAsNewSystem.Data.OracleClient.OracleConnection("database conn string")

DimcmdAsNewSystem.Data.OracleClient.OracleCommand("insert Into mer_categ(S_merc_name )

Values(:S_merc_name)",

conn)

cmd.Parameters.Add("S_merc_name",

OracleClient.OracleType.NVarChar).Value ="삼성"conn.Open()

cmd.ExecuteNonQuery()

conn.Close()

……………

运行结果一定让你满意。为什么通过设置command参数的形式就可以直接正确地写到数据库中,后台的处理机制还是不得而知,但我的猜测是将字符用数据库国家字符集的Unicode编码直接传到Oracle Server,而不需经过字符集的任何转换。

oracle存储藏语,Oracle数据库多语言文字存储解决方案(续)相关推荐

  1. oracle存储藏语,智能藏文词性自动标注系统的制作方法

    本发明涉及一种语言编译系统,确切是一种藏文词性自动识别并标注系统. 背景技术: 结合当前藏区经济文化发展需要及藏区文化与其他文化的交流的需要,首先需要构建一个统一高效的集藏文收集.编译及词性解释的网络 ...

  2. Oracle笔记之PS/SQL数据库程序设计语言 第一篇

    PS/SQL 前言 : PL/SQL基本结构 变量常量的用法 PS/SQL条件结构 PS/SQL循环结构 理解游标的使用 1. 程序结构及其变量 什么是PS/SQL? PS/SQL是一种高级数据库程序 ...

  3. oracle 存进去0的数据库,oracle11g 数据库导出报“ EXP-00003: 未找到段 (0,0) 的存储定义”错误的解决方案...

    导出oracle11.2.0.2的服务器的数据时,报"EXP-00003: 未找到段 (0,0) 的存储定义"错误.初步分析是由于数据表是空表导致该问题. Oracle 11G在用 ...

  4. oracle数据库sql培训,Oracle数据库SQL语言实战培训教程(全面、详细、案例、精讲)套餐...

    风哥oracle数据库SQL语言实战培训教程(案例.精讲)套餐,DBA必备技能. 套餐介绍: 风哥Oracle数据库SQL语言实战培训教程(案例.精讲)套餐,DBA必备技能. 内容: SQL语言基础入 ...

  5. oracle入门语,Oracle SQL 语言从入门到精通

    Oracle SQL 语言从入门到精通 作者:网络 佚名 2005-10-27 00:00 评论 分享 [IT168 服务器学院]数据库对象包括表.视图.索引.同义词.簇.触发器.函数.过程.包.数据 ...

  6. oracle支持几国语言,Oracle数据库多语言支持

    二.使用Unicode在需要支持多国语言的环境里,使用Unicode可以轻松解决数据存储问题. Oracle中支持以下几种Unicode编码?AL32UTF8 使用1,2,3个字节进行编码,扩展字符集 ...

  7. oracle - - 注释符,Oracle数据库扩展语言PL/SQL之注释、分隔符和标识符

    点击蓝字关注我吧 [本文详细介绍了Oracle数据库扩展语言PL/SQL的注释.分隔符和标识符,欢迎读者朋友们阅读.转发和收藏!] 1 基本概念 1.1 注释 注释不会被数据库编译,只是给开发人提供一 ...

  8. oracle v¥bh,ORACLE数据库sql语言、函数及常用命令

    file=c:\database\ydxt200108170926.dmp log=c:\database\ydxt200108170926.log fromuser=cur touser=cur1 ...

  9. oracle ko16mswin949,PRM DUL Oracle数据库恢复的最后一步

    PRM-DUL是一种Oracle数据抽取工具(data unloader for Oracle),其具备跳过Oracle数据库引擎,直接从块级别抽取数据行的能力. 基于此工具,无需数据库实例能够打开数 ...

最新文章

  1. 面试Android实习生
  2. MySQL数据库学习【第九篇】索引原理与慢查询优化
  3. 《Windows驱动开发技术详解》读书笔记(一)
  4. [蓝桥杯][算法提高VIP]最小乘积(提高型)-排序
  5. Webpack实战(八):教你搞懂webpack如果实现代码分片(code splitting)
  6. Github排序(转载)
  7. 中如何刷新当前路由_企业装修和家庭改造中,路由器及接收器如何安放
  8. 数据库系统——基本概念
  9. 通过 Nginx 来实现禁止国外IP访问网站
  10. 话筒性能测试软件,LogiTech的话筒屏蔽性能测试方案
  11. Dota2 AI 简易开发教程
  12. walking与Matlab入门教程-介绍示例模型
  13. AD19-DRC检查
  14. webview加载html图片不显示图片,WebView加载网页不显示图片解决办法
  15. 【第五周】新蜂团体贡献分
  16. MapReduce快速入门系列(4) | Hadoop序列化
  17. oracle静默创建实例linux,linux CentOS7下快速静默安装Oracle11GR2数据库并创建实例
  18. linux 创建分区 4t,centos对4T硬盘进行分区
  19. [2021 icas]PPG-BASED SINGING VOICE CONVERSION WITH ADVERSARIAL REPRESENTATION LEARNING
  20. java编程培训学习的就业前景好不好

热门文章

  1. leetcode系列-746.使用最小花费爬楼梯
  2. leetcode系列--17.电话号码的字母组合
  3. Lua manual翻译——第三章第七、八、九节
  4. 基于物联网(IOT)技术的智慧楼宇运营管理平台介绍
  5. ADO.NET连接MYSQL
  6. 简单记录一下开机自启动软件失效,无法自启的问题
  7. 开源日历 ,邮件协议历史和编程库
  8. mysql 5.7.20 my.cnf_mysql 5.7 的 /etc/my.cnf
  9. EasyRecovery15下载量高的恢复率高的数据恢复软件
  10. [转]《摄影艺术家陈冠希老师作品的文化解读》