如果你的系统是多语言版的你就会知道用CHAR有时一些汉字在转换时会出现乱码

解决方案 »

  1.   

    http://www.mssqlcity.com/Tips/design_optimization.htmUse varchar/nvarchar columns instead of text/ntext columns whenever possible.
    Because SQL Server stores text/ntext columns on the Text/Image pages separately from the other data, stored on the Data pages, it can take more time to get the text/ntext values.
    Use char/varchar columns instead of nchar/nvarchar if you do not need to store unicode data.
    The char/varchar value uses only one byte to store one character, the nchar/nvarchar value uses two bytes to store one character, so the char/varchar columns use two times less space to store data in comparison with nchar/nvarchar columns.
    Consider setting the 'text in row' SQL Server 2000 table's option.
    The text, ntext, and image values are stored on the Text/Image pages, by default. This option specifies that small text, ntext, and image values will be placed on the Data pages with other data values in a data row. This can increase the speed of read and write operations and reduce the amount of space used to store small text, ntext, and image data values. You can set the 'text in row' table option by using the sp_tableoption stored procedure.
      

  2.   

    如果希望列中所有数据项的大小接近一致,则使用 char/nchar。nvarchar/nchar最多支持4000。
    如果希望列中数据项的大小差异很大,则使用 varchar/nvarchar。varchar/char最多支持8000。如果varchar够用的话,text最好不要用,查询效率会很低。
      

  3.   

    varchar的效率也会比char的低一些,所以如果列中的数据大小接近一致的话,还是用char。
      

  4.   

    'n'开头的是unicode,是国际标准,支持多国语言
    text最好不用,只适于存储大数据,还要用专门的函数来读写更新,麻烦
      

  5.   

    vivianfdlpw() 同志的网站打不开,不好意思;总结一下各位的结论:
    1.text能不用就不用
    2.ntext 等,不需要就不用
    3.char比varchar效率高一些(请高人判断一下这句是否正确)还有一个问题未解决:用varchar(10),会不会比varchar(50)快一些?
    或者说,把varchar(50)用在原本可以用varchar(10)的地方,会不会造成效率降低?
      

  6.   

    1.用char型的字段,会不会因为它定长而比varchar快一些(哪怕是一点)?如果不是,我就全用varchar了,因为实在是懒得trim  用varchar,方便我们开发系统,但是就速度和空间考虑,用varchar没有char快,占的空间也大!
      char要在定长的情况下才好用,不然它会以空格填满,进行查询时就要处理。而我觉得字符型数据好象很少肯定定长的吧。2.用varchar(10),会不会比varchar(50)快一些?如果不是,就全用varchar(10000)了,因为实在懒得在insert的时候判断len(str),而且就算判断出来了,老提示用户字段过长也让人烦   这个我也想这样玩,不过我不敢这样定义!3.用nchar/char型的字段(包括另两对),区别是什么?以前似乎见有帖说是前者处理中文较好,但我一直用char型没有遇到过问题。而且,最关心的还是:nchar会不会比char的效率低一些?  多了个字母"n",它表示存储的是Unicode数据类型的字符。写过程序的朋友对Unicode应该很了解。字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。nchar、nvarchar的长度是在1到4000之间。和char、varchar比较:nchar、nvarchar则最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。例子:我们定义char(10),写入10个中文字符,报错,只能写入5个中文,用nchar(10),10就可以写入10个中文字符。效率的衡量没有一个定论!实际char()也是要占用2个字节来存储中文,如果你又要申辩:nchar用2个字节存储英文,的确,效率,实在很难有个定论!  4.text呢?效率比别两种慢不慢?除了存地数据多之外,还有没有别的优势?
      文本型数据中你可以存储超过20亿个字符串,怎么样,这个够大了吧?但是也不是任何时候都是和使用文本型数据,因为他非常占空间,也非常消耗服务器,随处乱用后果不堪设想!因为即使你像一个文本型字段输入了一个空值他都会占用2K的空间!而当这时除了删除该数据没有别的办法收回空间!效率不高这个可以肯定
      

  7.   

    当长度不确定是用varchar可以减少数据库大小!
    当长度确定是用char一样可以减少数据库大小!这两个属性一句话:一个是时间换空间,一个是空间换时间。我的选择是一个是时间换空间
      

  8.   

    谢谢 MorningTea(一勺抹茶)同志!另外有一问题:有无同志能给出varchar类型实际占用空间的表达式?这样可以有助于判断用char和varchar哪个更合适比如
    实际占用空间=f(字符串长度)=...
    谢谢!
      

  9.   

    phommy(顽石宫主),我昨天也在这个版面碰到同样的类似问题,问到空间回收的问题,我找了很多网上文章,讲到这方面的文章多半是讲Oracle,而且详细到segment,阀值! 不过关于sql server如何分配空间,除了我们知道用varchar(10)来存储‘我们’用4个byte之外,没有讲到很深的东西!  谈到你说用varchar(10),会不会比varchar(50)快一些?如果不是,就全用varchar(10000)了,因为实在懒得在insert的时候判断len(str),而且就算判断出来了,老提示用户字段过长也让人烦  我今天就因为这个差点都要被报重大异常,用户发了Mail给n个公司高层,非要我给个说法!  哎,我查呀查,发现是因为繁体简体的原因,写入到sql server乱码,秀出给用户是正常显示,但是我后台处理因为是乱码,对字串的解释认为过长,写不进去!这个不同编码和字串长度,真是差点害死我这个可怜的程序员呀!!!
      

  10.   

    呵呵 要是我有你的问题,只好用on error弄了,反正不管它超长不超长只管存,出错了就提示用户数据非法就是了...感觉varchar存(我们)肯定不是4个byte,至少要有个结束位(估计是个字节),或者它用一个字来存放这个字段的实际大小。也就是说,实际空间=字符串长度+1或+2或更多。关于其内部存储方式,估计只好问微软的人了,不过我做了个试验
    新建两个表table1 table2, 都只有一列,一个是 char(8000) 一个是varchar(8000),都插入了3050条记录(8000个字母a),在查询分析器中,输入:select * from table1
    select * from table2按ctrl+L,结果很惊人:
    第一句用掉了1.61%的成本,第二句用掉了98.39%。这就是char和varchar在定长字符串的处理中的效率比较
    更多实验进行中...
      

  11.   

    你问问经常出现在asp版的superdullwolf,好像他有点经验 phommy,我是有on error的!目前系统如何修改,我会继续更进,真是一个头两个大