CREATE TABLE t1 
(
 c1 varchar(3),
 c2 char(3)
)
GO
INSERT INTO t1 VALUES ('2', '2')
INSERT INTO t1 VALUES ('37', '37')
INSERT INTO t1 VALUES ('597', '597')
GO
SELECT REPLICATE('0', 3 - DATALENGTH(c1)) + c1 AS 'Varchar Column',
       REPLICATE('0', 3 - DATALENGTH(c2)) + c2 AS 'Char Column'
FROM t1
GOVarcgar Column    Char Column
002        2  
037          37 
597           597为什么会返回不一样的值 ,一样的值,一样的写法。
就是类型不一样。
感觉 下面的内条语句  REPLICATE('0', 3 - DATALENGTH(c2)) + c2 AS 'Char Column'
并没有把‘0’当成字符型, 而是直接当成了。数字型0,所有才没有返回数据前面的0
求高手解答阿。

解决方案 »

  1.   

    SELECT 
    DATALENGTH(c1) as c1len,
    DATALENGTH(c2) as c2len
    FROM t1char类型有尾随空格
      

  2.   

    c2 char(3)然后3 - DATALENGTH(c2) 永远为0
      

  3.   

    如楼上所说,char型数据,如果字符串没有填满,后面则跟随' '
    代码更改为如下即可:CREATE TABLE t1  
    (
     c1 varchar(3),
     c2 char(3)
    )
    GO
    INSERT INTO t1 VALUES ('2', '2')
    INSERT INTO t1 VALUES ('37', '37')
    INSERT INTO t1 VALUES ('597', '597')
    GO
    SELECT REPLICATE('0', 3 - DATALENGTH(c1)) + c1 AS 'Varchar Column',
      REPLICATE('0', 3 - DATALENGTH(rtrim(c2))) + c2 AS 'Char Column'
    FROM t1drop table t1/*
    Varchar Column Char Column 
    -------------- ------------
    002            002 
    037            037 
    597            597(所影响的行数为 3 行)
    */
      

  4.   

    呵呵 ,对头,忽视了,CHAR和VARCHAR的区别。 谢谢。
      

  5.   

    CHAR,是固定字符,不会像VARCHAR可自由变化。 谢了,这下长记性了。
      

  6.   

    char是固定长度类型,所以DATALENGTH(c2)永远是栏位长度,也就是3