zxe 发表于 2009-08-14 09:51

请问我的IDS11.5数据库char、nchar字段没有区别?

请问我的IDS11.5数据库char、nchar字段没有区别?
我用的是utf8编码
表test
字段name1    char(6)
字段name2    nchar(6)
insert into test values("我abc123","他abc123")
select * from test
显示——我abc   他abc
怎么没有区别?从结果看,一个汉字占3个字符位,一个汉字+3个字符刚好占去6个字符位。
ncahr的结果跟预想的不一样。错在哪?设置的问题吗?谢谢!

zhaowuxing 发表于 2009-08-14 09:51

原帖由 zxe 于 2009-8-16 07:06 发表 http://bbs2.chinaunix.net/images/common/back.gif
这东西看了难理解,还需要老师指点。
书上说char:汉字4000,字符8000
       nchar:汉字4000,字符4000
可结果不是。请解惑?谢谢!

char 汉字 4000 gb2312 字符 4000*2 utf-8 4000*3
nchar 汉字 4000 gb2312 字符 4000*2 utf-8 4000*3

不知道你看的什么书,那样理解是不对的!

char 和nchar 本质是一样的,只是系统在排序问题上才可能分开处理!

参考: 25118250 SQL指南_语法.pdf

第66页 技巧: CHAR(n)与NCHAR(n)数据之间的唯一区别是数据的排序和比较方式不相同.
可以在CHAR(n)列中存储非英文字符.然而,由于数据库服务器使用代码集顺序来对CHAR(n)列
中执行任何排序或比较,所以可能无法获得具有你所期望的顺序的结果

liaosnet 发表于 2009-08-14 10:11

怀疑由于你使用的数据库是以utf编码...故所有的存储均使用这样的方式..

在我使用的zh_CN.GBK字符集时.
create table tt1 ( t1 char(6),t2 nchar(6));
insert into tt1 values("我abcd1234","他abcd1234");

查询的结果是

> select * from tt1;

t1   t2   

我abcd 他abcd

1 row(s) retrieved.

jily_cunix 发表于 2009-08-14 10:32

首先可以先确认汉字占的字节数:
select length(name1),length(name2) from test;
其次想问问你是否设置了客户机的语言环境,CLIENT_LOCAL DB_LOCAL环境变量设置了吗?如果设置了是多少?
数据库默认的语言环境应该是en_US.819,你看看你访问数据库的systables表中tabid为90 91的表对应的site字段值分别是多少?

zxe 发表于 2009-08-14 11:02

回复 #2 liaosnet 的帖子

如果用gb,那没错,一个汉字占两个字符位,问题是char与nchar为何没有区别?

zxe 发表于 2009-08-14 11:07

回复 #3 jily_cunix 的帖子

select length(name1),length(name2) from test;
显示6   6
CLIENT_LOCAL DB_LOCAL SERVER_LOCALE均设为zh_cn.utf8
systables表中tabid为90 91的表对应的site字段值均为zh_cn.57372,57372应该是utf8吧

jily_cunix 发表于 2009-08-14 13:29

zh_cn.57372是UTF-8字符集。
NCHAR类型应该是在CLIENT_LOCALE与DB_LOCALE不一致时生效的吧,你的环境中设置的这两个值一致,不需要转换,NCHAR应该还是按CHAR类型处理的。
我的环境中目前不支持zh_cn.utf8,我也去找个包测试看看。

zhaowuxing 发表于 2009-08-14 14:37

这个char和nchar真的难区别!

这个只有在用的selectorder by ,between,in,matches ,like的情况下可能有区别!

区别就是:char只支持代码页排序,nchar可以通过

SET COLLATION语句来支持多个本地化整理顺序的字符串进行排序!


例如:英语都分,es_au(澳大利亚),es_us(美国),es_gb(英国)
根据它们不同的语言环境,排序就有些区别,但如果是char,就区别不出来了!

在例如: 中文gb2312是拼音排序,big5是按部首排序,而unicode的汉字统一按部首排序,

如果你的database是utf-8,而用户环境是gb2312,或希望按拼音排序,char就做不到了,
而nchar就可以通过Clent_locale来实现,在+上内码utf-8到gb2312的转换,
我猜可以实现用户本地化输入输出吧,没测试过!


参考IBM Informix GLS 使用指南!


[ 本帖最后由 zhaowuxing 于 2009-8-14 15:08 编辑 ]

jily_cunix 发表于 2009-08-14 15:17

informix默认是不支持中文utf8吧?我的操作系统支持,按网上建议找了张informix的ILS的光盘,把zh_cn.utf8的字符集安装了。设了几个环境变量:
DB_LOCALE=zh_CN.utf8
CLIENT_LOCALE=zh_CN.utf8
LANG=ZH_CN.UTF-8
重启数据库实例,再新创建的库就跟楼主的环境一样了。
utf8的汉字是3字节滴。
同意楼上说的。不过我把CLIENT_LOCALE改成多个值 什么zh_cn.big5 en_us.utf8等,有的报错无法转换,有的能转换,但查询的数据汉字部分有乱码。
对于LOCALE本地化方式验证DATE MONEY类型的更明显些。

liaosnet 发表于 2009-08-14 17:02

回复 #8 jily_cunix 的帖子

要理解这个参考
IBM Informix 数据库设计与实现指南
IBM Informix GLS 用户指南
IBM Informix 用户定义的例程与数据开发者指南
页: [1] 2
查看完整版本: 请问我的IDS11.5数据库char、nchar字段没有区别?