互联网服务db2 9.7

db2中文排序错乱的问题,谁遇到过

C:Usersdb2admin>db2 "select * from t_test order by name desc"
ID          NAME
----------- --------------------
          2 呦呦奶茶
          1 组合
          3 有意宾馆
  3 条记录已选择。


这是什么情况啊?有人遇到过没,咋解决啊
参与14

13同行回答

haoqingyunhaoqingyun数据库运维工程师CMBC
chenhui 同学给补充了一下。数据库缺省的排序和codeset和territory 以及collate有关。http://pic.dhe.ibm.com/infocente ... doc%2Fr0050490.htmldb2 "create database mydb on c: using codeset GBK territory CN"数据库地域         &n...显示全部
chenhui 同学给补充了一下。

数据库缺省的排序和codeset和territory 以及collate有关。
http://pic.dhe.ibm.com/infocente ... doc%2Fr0050490.html


db2 "create database mydb on c: using codeset GBK territory CN"

数据库地域                                              = CN
数据库代码页                                            = 1386
数据库代码集                                            = GBK
数据库国家/地区代码                                     = 86
数据库整理顺序                                          = UNIQUE
备用整理顺序                              (ALT_COLLATE) =

这个语句建立出来的数据库没有指定collate sequence,这里缺省的应该是system,对于非Unicode数据库,每一个代码页对应一种缺省的整理,这里的整理是SYSTEM_1386,是按照GBK编码排序的,也就是我上面贴的那个排序。

http://pic.dhe.ibm.com/infocente ... doc%2Fr0004565.html

如何按照拼音排序,10楼给了两个方法,第一个方法没问题,第二个方法在GBK中直接使用可能会有问题。因为UCA500R1_LZH_AN_CX_EX_FX_HX_NX_S3这个collate是针对UCA的,也就是unicode编码。unicode的编码有的和GBK一样,有的是不一样的,尽管在这里例子里的排序看起来是对的。收起
银行 · 2014-05-05
浏览2107
wangzk0206wangzk0206联盟成员数据库管理员scrcu
赞一个!显示全部
赞一个!收起
银行 · 2014-05-04
浏览1998
haoqingyunhaoqingyun数据库运维工程师CMBC
创建了两个db,分别utf8和gbk,然后用db2dart 看怎么存的,如下。UTF8:db2 "create table tab1 (c1 int, c2 varchar(10))"db2 "insert into tab1 values(1,'我们')"db2 "insert into tab1 values(2,'你们')"db2 "insert into tab1 values(3,'他们')"db2 "insert into tab1 valu...显示全部
创建了两个db,分别utf8和gbk,然后用db2dart 看怎么存的,如下。

UTF8:

db2 "create table tab1 (c1 int, c2 varchar(10))"
db2 "insert into tab1 values(1,'我们')"
db2 "insert into tab1 values(2,'你们')"
db2 "insert into tab1 values(3,'他们')"
db2 "insert into tab1 values(4,'孩们')"
db2 "insert into tab1 values(5,'呦呦')"
db2 "insert into tab1 values(6,'组合')"


->db2 "SELECT * from tab1 order by c2 desc"

C1          C2
----------- ----------
          6 组合
          1 我们
          4 孩们
          5 呦呦
          2 你们
          3 他们

  6 record(s) selected.


->db2 "SELECT * from tab1 order by COLLATION_KEY_BIT(c2, 'UCA500R1_LZH_AN_CX_EX_FX_HX_NX_S3') desc"

C1          C2
----------- ----------
          6 组合
          5 呦呦
          1 我们
          3 他们
          2 你们
          4 孩们

  6 record(s) selected.


db2dart d1014 /dd /tsi 3 /oi 4 /ps 0 /np 10 /v y /rptn haha.utf.dart2

    364                   Column 1:
    365             Fixed offset: 0
    366                   Type is Long Integer
    367                   Value = 5
    368
    369                   Column 2:
    370             Fixed offset: 5
    371                   Type is Variable Length Character String
    372                   Length = 6 Offset = 10
    373                       E591A6E5 91A6                          ......   =====> 这是“呦呦”

    387                   Column 1:
    388             Fixed offset: 0
    389                   Type is Long Integer
    390                   Value = 6
    391
    392                   Column 2:
    393             Fixed offset: 5
    394                   Type is Variable Length Character String
    395                   Length = 6 Offset = 10
    396                       E7BB84E5 9088                          ......=====> 这是“组合”



GBK:
->db2 "SELECT * from tab1 order by c2 desc"

C1          C2
----------- ----------
          5 呦呦
          6 组合
          1 我们
          3 他们
          2 你们
          4 孩们

  6 record(s) selected.

->db2 "SELECT * from tab1 order by COLLATION_KEY_BIT(c2, 'UCA500R1_LZH_AN_CX_EX_FX_HX_NX_S3') desc"

C1          C2
----------- ----------
          6 组合
          5 呦呦
          1 我们
          3 他们
          2 你们
          4 孩们

  6 record(s) selected.


    364                   Column 1:
    365             Fixed offset: 0
    366                   Type is Long Integer
    367                   Value = 5
    368
    369                   Column 2:
    370             Fixed offset: 5
    371                   Type is Variable Length Character String
    372                   Length = 4 Offset = 10
    373                       DFCFDFCF                               ....=====> 这是“呦呦”

    387                   Column 1:
    388             Fixed offset: 0
    389                   Type is Long Integer
    390                   Value = 6
    391
    392                   Column 2:
    393             Fixed offset: 5
    394                   Type is Variable Length Character String
    395                   Length = 4 Offset = 10
    396                       D7E9BACF                               ....=====> 这是“组合”


这样我们就可以看到DB2是怎么保存中文的了。
并且,排序的话看起来是按照编码后的字符顺序。

UTF:
1 E68891E4 BBAC
2 E4BDA0E4 BBAC
3 E4BB96E4 BBAC
4 E5ADA9E4 BBAC
5 E591A6E5 91A6
6 E7BB84E5 9088

          6 组合
          1 我们
          4 孩们
          5 呦呦
          2 你们
          3 他们


GBK:
1 CED2C3C7
2 C4E3C3C7
3 CBFBC3C7
4 BAA2C3C7
5 DFCFDFCF
6 D7E9BACF

          5 呦呦
          6 组合
          1 我们
          3 他们
          2 你们
          4 孩们收起
银行 · 2014-05-04
浏览2142
winddingwindding软件开发工程师NBHJSoft
二种方法本人觉得第一种较好,这样避免查询语句太过冗长,第二种方法适合库已建且不能重建的情况显示全部
二种方法本人觉得第一种较好,这样避免查询语句太过冗长,第二种方法适合库已建且不能重建的情况收起
软件开发 · 2014-04-02
浏览2220
winddingwindding软件开发工程师NBHJSoft
终于解决此问题,方法有二:1、建库时,如果使用 utf-8,指定排序方法为 UCA500R1_LZH_AN_CX_EX_FX_HX_NX_S3,如:create database db ...... codeset utf-8 territory cn collate using UCA500R1_LZH_AN_CX_EX_FX_HX_NX_S3 ......2、查询语句的 order by 部份使用 collation_key_bi...显示全部
终于解决此问题,方法有二:
1、建库时,如果使用 utf-8,指定排序方法为 UCA500R1_LZH_AN_CX_EX_FX_HX_NX_S3,如:
create database db ...... codeset utf-8 territory cn collate using UCA500R1_LZH_AN_CX_EX_FX_HX_NX_S3 ......
2、查询语句的 order by 部份使用 collation_key_bit 函数,如:
order by COLLATION_KEY_BIT(ft, 'UCA500R1_LZH_AN_CX_EX_FX_HX_NX_S3')收起
软件开发 · 2014-04-02
浏览2282
redsprredspr数据库管理员北京普远天成科技有限公司
排序是跟你建库的字符集设置有关吧显示全部
排序是跟你建库的字符集设置有关吧收起
互联网服务 · 2014-03-26
浏览2135
ppjava2009ppjava2009系统工程师用友汽车信息科技(上海)有限公司
DB2支持的众多编码集,没道理不认识的,我觉得6#说得正确,中文排序还是采用自定义函数进行排序吧,这样规则可以自己定,如果非要纠结的话,可以开PMR,请实验室协助解决一下了。显示全部
DB2支持的众多编码集,没道理不认识的,我觉得6#说得正确,中文排序还是采用自定义函数进行排序吧,这样规则可以自己定,如果非要纠结的话,可以开PMR,请实验室协助解决一下了。收起
互联网服务 · 2014-03-26
浏览2131
jgq840930jgq840930数据库管理员XXXX
那为什么不用那个呦呦奶茶 就能正常排序呢。我一度以为,DB2不认识呦呦这个字 回复 6# leo_wyn 显示全部
那为什么不用那个呦呦奶茶 就能正常排序呢。我一度以为,DB2不认识呦呦这个字 回复 6# leo_wyn 收起
互联网服务 · 2014-03-25
浏览2153
leo_wynleo_wyn商业智能工程师Security
db2 目前还不支持,如果采用拼音排序,可以通过自定义函数取得汉字拼音的首字母,在进行排序但数据很多的情况下,性能很差!显示全部
db2 目前还不支持,如果采用拼音排序,可以通过自定义函数取得汉字拼音的首字母,在进行排序

但数据很多的情况下,性能很差!收起
系统集成 · 2014-03-25
浏览2190
leo_wynleo_wyn商业智能工程师Security
oracle 中有类似的中文排序方法:      NLS_SORT=SCHINESE_RADICAL_M  按照部首排序  NLS_SORT=SCHINESE_STROKE_M 按照笔画排序  NLS_SORT=SCHINESE_PINYIN_M 按照拼音排序显示全部
oracle 中有类似的中文排序方法:

      NLS_SORT=SCHINESE_RADICAL_M  按照部首排序
  NLS_SORT=SCHINESE_STROKE_M 按照笔画排序
  NLS_SORT=SCHINESE_PINYIN_M 按照拼音排序收起
系统集成 · 2014-03-25
浏览2168

提问者

jgq840930
数据库管理员XXXX

相关问题

问题状态

  • 发布时间:2014-03-25
  • 关注会员:1 人
  • 问题浏览:25311
  • 最近回答:2014-05-05
  • X社区推广