在c#中oracle做为数据库,varchar2的问题

aiddy 2004-04-01 11:19:03
在c#中Oracle8i做为数据库,比如说姓名字段,在数据库中为varchar2(8), 在窗体上限制TextBox的maxlength为8,C#中把1个汉字长度看作1,所以在输入英文时没有问题。但如果输入汉字“阿里斯里娃",用length判断长度为5,但Oracle中把1个汉字长度看作2,如果就会报错。 看了csdn里一些相关贴子,总不能完美解决问题,请问高手们如果能解决这个问题。 Sql server里好像把汉字做为1个对待的,Oracle中能否把汉字长度作为1来对待?
特急。。。。。。。。。。盼回..................
...全文
186 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sy246 2004-04-07
  • 打赏
  • 举报
回复
??
legumer 2004-04-05
  • 打赏
  • 举报
回复
可以用select lengthb('地方艰苦但是') from dual;
LENGTHB('地方艰苦但是')
-----------------------
12

字符集为中国中文ZHS16GBK
洪十二 2004-04-02
  • 打赏
  • 举报
回复
study
baojianjun 2004-04-02
  • 打赏
  • 举报
回复
给个参考:
http://expert.csdn.net/Expert/topic/2014/2014176.xml?temp=.3214533
http://expert.csdn.net/Expert/topic/1998/1998729.xml?temp=.2357599

导出/导入与字符集
明白ORACLE多国语言设置,ORACLE多国语言设置是为了支持世界范围的语言与字符集,一般对语言提示、货币形式、排序方式和CHAR,VARCHAR2,CLOB,LONG字段的数据的存储/显示等有效。ORACLE多国语言设置最主要的两个特性就是国家语言设置与字符集设置。国家语言设置决定了界面或提示使用的语言种类;字符集决定了数据库保存与字符集有关数据(如文本)的编码规则。正如上面的一个小例子,环境变量NLS_LANG的不同,导致EXP帮助发生变化,这就是多国语言设置的作用(NLS_LANG包含国家语言设置与字符集设置,这里起作用的是国家语言设置,而不是字符集)。
ORACLE字符集设定,分为数据库字符集和客户端字符集环境设置。在数据库端,字符集在创建数据库的时候设定,并保存在数据库props$表中,对于8i以上产品,已经可以采用“Alter database character set 字符集”来修改数据库的字符集,但也仅仅是从子集到超集。不要通过update props$来修改字符集,如果是不支持的转换,可能会失去所有与字符集有关的数据,就是支持的转换,也可能导致数据库的不正常工作。字符集分为单字节字符集与多字节字符集,US7ASCII就是典型的单字节字符集,在这种字符集中length=lengthb,而ZHS16GBK就是常用的双字节字符集,在这里lengthb=2*length。
客户端的字符集环境比较简单,主要是环境变量或注册表项NLS_LANG,注意NLS_LANG的优先级别为:参数文件à注册表à环境变量àalter sessionà函数。NLS_LANG的组成为“国家语言设置.字符集”,如nls_lang=simplified chinese_china.zhs16gbk。客户端的字符集最好与数据库端一样(国家语言设置可以不一样,如zhs16gbk的字符集,客户端可以是nls_lang =simplified chinese_china.zhs16gbk或Ameircan_America.zhs16gbk,都不影响数据库字符的正常显示),如果字符集不一样,而且字符集的转换也不兼容,那么客户端的数据存储/显示和导出/导入的与字符集有关的数据将都是乱码。
使用一点点技巧,就可以使导出/导入在不同的字符集的数据库上转换数据。这里需要一个2进制文件编辑工具即可,如uedit32。用编辑方式打开导出的dmp文件,获取2、3字节的内容,如00 01,先把它转换为10进制数,为1,使用函数NLS_CHARSET_NAME即可获得该字符集:
SQL> select nls_charset_name(1) from dual;
NLS_CHARSET_NAME(1)
-------------------
US7ASCII
可以知道该dmp文件的字符集为US7ASCII,如果需要把该dmp文件的字符集换成ZHS16GBK,则需要用NLS_CHARSET_ID获取该字符集的编号:
SQL> select nls_charset_id('zhs16gbk') from dual;
NLS_CHARSET_ID('ZHS16GBK')
--------------------------
852
把852转换成16进制数,为354,把2、3字节的00 01换成03 54,即完成了把该dmp文件字符集从us7ascii到zhs16gbk的转化,这样,再把该dmp文件导入到zhs16gbk字符集的数据库就可以了。(注意,十进制与十六进制之间的转换,想明白其中的道理)
怎么样查看数据库字符集
[A]数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集。
客户端字符集环境select * from nls_instance_parameter,其来源于v$parameter,
表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表
会话字符集环境 select * from nls_session_parameter,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameter一致。
客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件
字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。


1.查询服务器端配置的字符集。在sqlplus中以dba用户执行:
select tab1.aa||'_'||tab2.bb||'.'||tab3.cc from (select VALUE$ aa from sys.props$ where name='NLS_LANGUAGE')tab1,(select VALUE$ bb from sys.props$ where name='NLS_ISO_CURRENCY')tab2,(select VALUE$ cc from sys.props$ where name='NLS_CHARACTERSET')tab3;

2.在客户端的注册表HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE->HOME0中,如无系统变量NLS_LANG,则“新建”->“字符串”,重命名为“NLS_LANG”,并赋值为上述查询变量的值(注意引号内的字符应大写),再查看时不需要重启Oracle。

1、检查服务器上Oracle数据库的字符集

SQL> conn sys/change_on_install
连接成功.

SQL> desc props$
列名 可空值否 类型
------------------------------- -------- ----
NAME NOT NULL VARCHAR2(30)
VALUE$ VARCHAR2(2000)
COMMENT$ VARCHAR2(2000)

SQL> col value$ format a40
SQL> select name,value$ from props$;

NAME VALUE$
------------------------------ -------------------------
DICT.BASE 2
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_DATE_FORMAT DD-MON-YY
NLS_DATE_LANGUAGE AMERICAN
NLS_CHARACTERSET ZHS16GBK
NLS_SORT BINARY
NLS_CALENDAR GREGORIAN
NLS_RDBMS_VERSION 7.3.4.0.0
GLOBAL_DB_NAME ORACLE.WORLD
EXPORT_VIEWS_VERSION 3



NLS_CHARACTERSET和NLS_CHAR_CTERSET这个参数应该是ZHS16GBK,如不是,改为它。

SQL*Plus中修改方法:
SQL> update props$ set value$='新字符集' where name='NLS_CHARACTERSET';

solaris8、oracle8.1.7

环境:
ORACLE_SID=ora8i
ORACLE_BASE=$HOME
ORACLE_HOME=$ORACLE_BASE/products/8.1.7
NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
LD_LIBRARY_PATH=/usr/lib:/usr/dt/lib:/usr/openwin/lib:$ORACLE_HOME/lib
PATH=$PATH:/usr/dt/bin:/usr/openwin/bin:$ORACLE_HOME/bin
export ORACLE_BASE ORACLE_HOME ORACLE_SID NLS_LANG LD_LIBRARY_PATH PATH

v$nls_parameters的内容:
'PARAMETER','VALUE'
'NLS_LANGUAGE','SIMPLIFIED CHINESE'
'NLS_TERRITORY','CHINA'
'NLS_CURRENCY','RMB'
'NLS_ISO_CURRENCY','CHINA'
'NLS_NUMERIC_CHARACTERS','.,'
'NLS_CALENDAR','GREGORIAN'
'NLS_DATE_FORMAT','DD-MON-RR'
'NLS_DATE_LANGUAGE','SIMPLIFIED CHINESE'
'NLS_CHARACTERSET','US7ASCII'
'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 TZH:TZM'
'NLS_TIMESTAMP_TZ_FORMAT','DD-MON-RR HH.MI.SSXFF AM TZH:TZM'
'NLS_DUAL_CURRENCY','RMB'
'NLS_NCHAR_CHARACTERSET','US7ASCII'
'NLS_COMP','BINARY'


字符集是US7ASCII,怎样设置为ZHS16GBK(是否这样写)呢?
请大家帮帮忙吧,多谢了


---------------------------------------------------------------

c:\>svrmgrl
在svrmgrl中执行:
shutdown
startup mount
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
ALTER DATABASE OPEN;
update props$ set value$='ZHS16GB' WHERE NAME='NLS_CHARACTERSET';
update props$ set value$='ZHS16GB' WHERE NAME='NLS_NCHAR_CHARACTERSET';
先申明此法很危险,
如果改错了值可能会导致数据库无法打开。

×××××××××××××
修改字符集的步骤:
c:\>svrmgrl
在svrmgrl中执行:
connect internal/oracle[@dbname];
shutdown immediate;
startup restrict;
ALTER DATABAE [dbname] CHARACTER SET [SIMPLIFIED CHINESE_CHINA.]ZHS16GBK ;
ALTER DATABAE [dbname] NATIONAL CHARACTER SET [SIMPLIFIED CHINESE_CHINA.]ZHS16GBK ;
alter database [dbname] open;
--shutdown immediate;
--startup;


怎么样查看数据库字符集
[A]数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集。
客户端字符集环境select * from nls_instance_parameter,其来源于v$parameter,
表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表
会话字符集环境 select * from nls_session_parameter,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameter一致。
客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件
字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。
yfjyz 2004-04-02
  • 打赏
  • 举报
回复
这个是字符集的问题,如果数据库是英文字符集,则“阿里斯里娃"的长度是10
如果是中文字符集的,则“阿里斯里娃"的长度是5
snowy_howe 2004-04-02
  • 打赏
  • 举报
回复
SQL> select length('地方艰苦但是') from dual;

LENGTH('地方艰苦但是')
----------------------
6

字符集为中国中文ZHS16GBK
课 程 设 计 报 告 书 目 录 第1章 引言 3 第2章 概要设计 5 2.1系统需求分析 5 2.2系统结构设计 5 2.3系统功能模块 6 第3章 数据库分析 7 3.1 数据库总体设计 7 3.2 数据表设计 7 3.3 数据库的创建 8 3.4存储过程和触发器 10 第4章 详细设计及测试 12 4.1 系统界面 12 4.2 主要代码设计 15 4.3 功能整体链接测试 18 第5章 课程设计心得 19 第1章 引言 1.设计目的 使用VC,C++,C#等作为前台开发工具,使用Oracle作为后台数据库,所设计的管理 系统应包含输入输出、查询、插入、修改、删除等基本功能。根据题目的基本需求,设 计系统界面、数据库、编写程序(Oracle),并写出课程设计报告 1、阅读资料:每个人必须提前阅读教材有关Oracle、VC、C++、C#应用方面的内容以 及其它相关书籍。 2、需求分析:题目要求达到的功能,所提供的原始数据,需要输出的数据及样式等 。 3、数据库的设计:根据要求设计数据库的结构,包括:表、数据完整性、关系、视 图。 4、数据库的安全性设计:登录用户、数据库用户、数据库角色、命令许可等方面 涉及到数据的所有操作要求采用存储过程的方式进行。 2.设计要求 1. 选好题目:先分组,每组两个人(或单独完成),必须确保每题有两组人员选做,班长 将本班同学的选题情况汇总后于16周之前交。 2. 独立思考,独立完成:课程设计各任务的设计和调试要求独立完成,遇到问题可以讨 论,但不可以拷贝,否则不管是抄袭还是被抄袭,雷同的全部直接评定为不及格。 3. 做好上机准备:每次上机前,要事先编制好准备调试的程序,认真想好调试步骤和有关 环境的设置方法,准备好有关的文件。 4. 根据编程实现的结果,按课程设计报告的撰写规范完成数据库系统课程设计报告(课程 设计报告必须有相关原理分析、程序设计、程序实现和程序调试等内容);课程设计 报告的具体要求如下: 1) 课设报告按照规定用A4纸张进行排版打印,否则要求返工; 2) 课设报告的内容顺序如下:封面—任务书—文摘要—目录—正文—附录; 3) 正文不少于4000字,正文部分至少包含以下内容,并可大致作如下安排 1.引言(包括设计目的、要求、设计环境、同组人员及分工等内容) 2.概要设计(含系统需求分析、系统结构设计和功能模块设计等内容) 3.详细设计(含系统数据库设计、系统主要功能模块设计(可用流程图表示)和各 模块的主要算法对应的原代码(详细)等内容) 4.调试与运行结果及存在的主要问题(包括调试、运行和存在的问题) 5.课程设计小结(或总结)(对此课程设计所做的工作内容进行总结,并提出系统 还可以进行改进的地方) 3.设计环境 1.Windows7旗舰版32位 2.Microsoft Visual Studio 2005 3.Oracle 11g 第2章 概要设计 2.1系统需求分析 图书管理系统主要是用oracle数据库进行逻辑处理,实现对图书信息的增删改查,以 及出库入库的管理。 2.2系统结构设计 图2.2. 图书E-R图 2.3系统功能模块 图2.4 系统功能模块图 第3章 数据库分析 3.1 数据库总体设计 数据库设计是图书管理系统的重要组成部分。建立良好的数据库结构和文件组织形式 ,能够使系统快速、准确的获得所需信息。这里采用oracle 数据库。该数据库对进行增、删、改、查、显示都极为方便。能为系统提供良好的数据 支持。根据系统的详细分析和和总体的需求分析,将为各个不同模块详细设计数据结构 。 3.2 数据表设计 用户表(yonghu) "字段名 "字段 "数据类型 "主键 "索引 "值 "说明 " "eno "用户ID "number "Yes " " " " "ename "用户名 "varchar2(10" " " " " " " ") " " " " " 图书类别表(typ) "字段名 "字段 "数据类型 "主键 "索引 "值 "说明 " "TID "类别编 "varchar2(10"Yes " " " " " "号 ") " " " " " "TypeName"类别名 "varchar2(10" " " " " " "称 ") " " " " " 图书表(books) "字段名 "字段 "数据类型 "主键 "索引 "值 "说明 " "ISBN "图书编号 "varchar2(20)"Yes " " " " "BookName "名称 "varchar2(40)" " " " " "TID "类别编号 "varchar2(10)" " " " " "RetailPrice "零售价 "varchar2(10)" " " " " "Author "作者 "

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧