请dudu帮帮忙,放在首页几天。虽然本问题已有变通的解决方案,但还想求教高高手,不知在给定前提下是否还有更完美的方案。
2002年从C++转投.net阵营至今一直玩的得心应手,虽然用oracle居多(因为是正版的^_^),但从来没觉得sqlserver 2K有什么问题。很多方面要比oracle好,但结果到了非洲,才发现sqlserver对unicode的支持好像有问题。(试了一下oracle 8.1.7问题一样,9i卸载掉了没试。)
现状描述:
我在非洲做志愿者,应单位要求写了一个埃塞俄比亚当地阿姆哈拉语(以下简称阿语)的网站。数据库是sqlserver 2000 en sp4,asp.net 2.0 ,用nvarchar字段,能存储与显示阿姆哈拉语,用全文索引也能实现文章查找了。
新问题:全文索引因为没有阿姆哈拉语字典文件,故断词是按空格来算的。这样的话就有局限性,比如输入bo查出book的功能实现不了。(当然英文里全文索引这样也是不行的,因为bo不是一个word,所以也就不是keyword。但既然有这个要求我认为只有采用like '%keyword%'方式了。数据量很小,建个索引,性能不是问题。)
新需求:用like 语句查title,类似英文中输入bo 或是b,o等关键字查出book,只不过现在是改成阿语的unicode字母
新需求碰到的问题:sqlserver 2k的like似乎不支持阿语的unicode。
对于中英日韩文,用like模糊查询没有问题。我试过title LIKE '%おいしい%' 可查出"毎日おいしい食べ物を食べています" 。
但是对于阿语,title里明明有“???”(注:因为没阿语字体,大家IE里显示的应该是3个方框,如果是问号证明blog存到后台时已经因为数据的问题被替换了),我用 title like '%?%' 却没有任何结果。
所以想请教一下各位大侠怎么办?
前提:只能用sqlserver 2K SP4的数据库(sqlserver2005+vista试过,可以支持阿语的查询。 )
最耍赖的解决方案:把231个阿姆哈拉语映射到其他能被系统支持的特殊字符集上面,replace来replace去,这样在sql里就能进行like操作了。只不过存在数据库里的是天书了(当然不重映射,存起来的也都是方框,谁也看不懂),只是要做231次replace,实在是不得已的办法,而且源代码里全是框框到稀奇古怪的字,真是看着痛苦。
关于猜测sqlserver2k sp4下此问题无解的实验。
1.出现问题
第1个查询证明sqlserver能支持中,日文等unicode的模糊查询
第2个查询证明sqlserver不支持阿语的unicode模糊查询
右边word里是完整的sql,因为SQLSERVER的IDE显示阿语有问题,只有word才行正常显示
其中粉色框是mysql 5.0.45的实验,能支持阿语,自带的查询工具没问题。
2.分析问题
我们可以看到,出现不支持的原因是阿语unicode的解析时出现了问题。变处理成了?号
3 问题无解
根据sqlserver帮助中N'keyword'方法强制指定为unicode,在Northwind中实验成功,但是在阿语系统中出现了新的问题。图2中是处理成?号。强行这里强制指定后成null了。
另外试以参数模式进行like还有charindex和pathindex语句 同样无效。
结论:不变通一下,个人认为sqlserver2K没法解决这个问题了。
我的其他实验:
Access实验
阿语输入后在sqlserver 2k里显示出来的是方框但在access 2003数据库里却能正常显示。似乎sqlserver2K比access2003更失败。
access虽然能正常显示阿语。但是用like '*?*'(注:access的语法与sql不一样。它是用*号的),却是查出了所有记录。我分析了一下原因和sqlserver一样因为无法解析'?',所以作忽略处理,like '*?*'变成了like '**',所以结果是显示所有记录。
Mysql实验
前面图1中提到mysql5.0.45 英文版,在设计表结构时选varchar,同时将字段的字符集全选从latin1改成utf8,然后就能存储阿语了,MySQLQueryBrowser中用like '%?%' 能查出“???”这条记录。(注:如果不改字段字符集连存储都有问题,insert不进去)
另外如果要在.net中查询阿语,一定要用官方的connect/net 5.1驱动。另外把my.ini中的字符集改为utf8,记得一定要重启。不然没用。
现提供阿姆哈拉语字体文件供大家做实验。(就当收藏品吧,国内比较难找)
/Files/tongzhenhua/gfzemenu.rar