Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1566782
  • 博文数量: 201
  • 博客积分: 2812
  • 博客等级: 少校
  • 技术积分: 3029
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-18 18:28
个人简介

从事数据库工作多年,目前看好分布式NeSQL/HTAP数据库在企业客户市场的发展。未来的主要方向是——致力于 NewSQL/HTAP 数据库的推广普及。

文章存档

2016年(1)

2015年(8)

2014年(23)

2013年(50)

2012年(32)

2011年(87)

分类: Sybase

2013-11-22 14:02:13

    在创建IQ数据库时正确指定字符集(通过COLLATION字句)是一项很重要的工作。如果指定错误,可能会为应用开发带来影响。而且,IQ数据库字符集一旦设定就不嫩再更改。下面结合一个最近遇到的问题加以说明。 这个问题是在采用ISO_BINENG或ISO_1字符集的IQ数据中执行REPLACE替换,由于ISO字符集不能正确解释汉字,当替换时有可能错误的替换组成汉字的两字节中的某个字节,从而造成汉字被错误替换。
    问题重现步骤:
 
1. 连接到字符集为ISO_BINENG的IQ数据库
   执行如下步骤:
  (1) isql -UDBA -Psql -Siqdemo -Jcp936
  (2) create table t1 (id int, name char(30))
  (3) insert into t1 values(1,'abc[dd慬xx[xx')
  (4) select replace(name,'[','') from t1
      查询结果为:abcdd憍xxx --error

     通过上面的例子我们看到,汉字 "慬" 的代码为91 5B,而方括号"["的代码为5B,这样在用replace函数替换字符串

 'abc[dd慬xx[xx' 中出现的"["时,就会把汉字 "慬"错误的进行替换。

     那么如何解决呢?最好的办法是使用正确的字符集,比如数据库采用936ZHO字符集。我们可以采用如下的步骤测试一下:

 2. 连接字符集为936ZHO的IQ数据库(select default_collation from sysinfo可以查看数据库字符集)
    执行如下的步骤:
  
   (1) isql -UDBA -Psql -Siqdemo -Jcp936
   (2) create table t1 (id int, name char(30))
   (3) insert into t1 values(1,'abc[dd慬xx[xx')
   (4) select replace(name,'[','') from t1
       查询结果为:abcdd慬xxxx     --OK 
  
     说明:如果IQ数据库中存放汉字的话,建议大家使用936ZHO字符集或者UTF-8字符集。特别对于IQ 15.X版本和IQ 16版本,如果仍然使用ISO_BINENG或ISO_1存储汉字,那么会遇到很多问题。广大开发者一定要切记!

阅读(3407) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~