• 走进非洲,发现全错了关于sqlserver2000下全球化网站生僻语种sql查询的解决方案


        请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

  • 相关阅读:
    网络请求与远程资源
    JavaScript对象
    微信小程序抓包Charles
    归并排序
    顺序表
    后缀表达式
    中缀表达
    ES6 Promise
    Es 方法
    10.26学习
  • 原文地址:https://www.cnblogs.com/tongzhenhua/p/912618.html
Copyright © 2020-2023  润新知