create table test
(队伍 varchar(6),胜负 char(2))
goinsert into test
select '湖人','胜' union all
select '马刺','胜' union all
select '太阳','负' union all
select '马刺','负' union all
select '热火','胜' union all
select '湖人','胜' union all
select '太阳','负' union all
select '热火','负' 
goselect * from test
查询结果如下:
问题:
这是什么情况,我用的sql2005,除了这个问题,数据类型和字符长度都够了啊,当然数字可以正常显示,一旦涉及汉字或者字符等就是如上图效果了,请遇到此类问题的大神指点迷津?但我通过附加的一个数据库,里面运行上述语句,查询结果正常。数据库数据导入后查询结果异常,无法显示

解决方案 »

  1.   

    初步预测是你的os语言与sqlserver的不同,假设一个是繁体,一个是简体,用Unicode类型即可,我这里假设你的长度足够,如果换了Unicode不够的话,就加长吧,注意数据那里也加了N
    create table test
    (队伍 Nvarchar(6),胜负 Nchar(2))
    go
     
    insert into test
    select N'湖人',N'胜' union all
    select N'马刺',N'胜' union all
    select N'太阳',N'负' union all
    select N'马刺',N'负' union all
    select N'热火',N'胜' union all
    select N'湖人',N'胜' union all
    select N'太阳',N'负' union all
    select N'热火',N'负' 
    go
      

  2.   

    你看看你附件的那个数据库的排序规则:右击→属性→常规→维护下颚排序规则。
    在看看你当前数据库的排序规则,把当前数据库的排序规则设置成附件的那个数据库的排序规则。--
    ALTER DATABASE DEV_SIMENS SET SINGLE_USER WITH ROLLBACK IMMEDIATEALTER DATABASE DEV_SIMENS SET multi_USERuse master 
    go
    alter database DEV_SIMENS collate Chinese_PRC_CI_AI 
    go
      

  3.   

    这种情况之前也碰到过,主要是排序规则不一样导致的,还是需要把数据类型改为nvarchar和nchar。下面是一个实验,还原问题,以及解决问题:--在我的sql server 2008上
    create table test
    (
     队伍 varchar(6) collate Greek_CS_AI, --这个排序规则是随便选了一个的
     胜负 char(2) collate Greek_CS_AI     --用来模拟你原来数据库的排序规则
    )
    go
     
    insert into test
    select '湖人','胜' union all
    select '马刺','胜' union all
    select '太阳','负' union all
    select '马刺','负' union all
    select '热火','胜' union all
    select '湖人','胜' union all
    select '太阳','负' union all
    select '热火','负' 
    go
     
     
    select * from test
    /*
    队伍 胜负
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    */ --之所以显示出这样是由于你新的服务器上的排序规则是Chinese_PRC_CI_AS
    --所以就不能正常显示了。
    --那怎么办呢?--这个时候修改列的排序规则,或者把数据类型修改为nvarchar,也没什么效果
    alter table test alter column 队伍 varchar(6) --collate Chinese_PRC_CI_ASalter table test alter column 胜负 char(2) --collate Chinese_PRC_CI_AS--显示还是不正常
    select 队伍,
           胜负       
           
    from test 
    /*
    队伍 胜负
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    */ 
    drop table test--通过nvarchar和nchar类型,能比较好的解决问题
    create table test
    (
     队伍 nvarchar(6) collate Greek_CS_AI, --这个排序规则是随便选了一个的
     胜负 nchar(2) collate Greek_CS_AI     --用来模拟你原来数据库的排序规则
    )
    go
    insert into test
    select N'湖人',N'胜' union all
    select N'马刺',N'胜' union all
    select N'太阳',N'负' union all
    select N'马刺',N'负' union all
    select N'热火',N'胜' union all
    select N'湖人',N'胜' union all
    select N'太阳',N'负' union all
    select N'热火',N'负' 
    go
     
    --现在虽然原始列的排序规则是 Greek_CS_AI
    --而当前数据库的排序规则是Chinese_PRC_CI_AS,但数据照样能正常显示
    select *
    from test
    /*
    队伍 胜负
    湖人 胜 
    马刺 胜 
    太阳 负 
    马刺 负 
    热火 胜 
    湖人 胜 
    太阳 负 
    热火 负 
    */
     
      

  4.   

    代码修改一下--在我的sql server 2008上
    create table test
    (
     队伍 varchar(6) collate Greek_CS_AI, --这个排序规则是随便选了一个的
     胜负 char(2) collate Greek_CS_AI     --用来模拟你原来数据库的排序规则
    )
    go
     
    insert into test
    select '湖人','胜' union all
    select '马刺','胜' union all
    select '太阳','负' union all
    select '马刺','负' union all
    select '热火','胜' union all
    select '湖人','胜' union all
    select '太阳','负' union all
    select '热火','负' 
    go
     
     
    select * from test
    /*
    队伍 胜负
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    */ --之所以显示出这样是由于你新的服务器上的排序规则是Chinese_PRC_CI_AS
    --所以就不能正常显示了。
    --那怎么办呢?--这个时候修改列的排序规则,或者把数据类型修改为nvarchar,也没什么效果
    alter table test alter column 队伍 varchar(6) collate Chinese_PRC_CI_ASalter table test alter column 胜负 char(2) collate Chinese_PRC_CI_AS--显示还是不正常
    select 队伍,
           胜负       
           
    from test 
    /*
    队伍 胜负
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    ?? ? 
    */ 
    drop table test--通过nvarchar和nchar类型,能比较好的解决问题
    create table test
    (
     队伍 nvarchar(6) collate Greek_CS_AI, --这个排序规则是随便选了一个的
     胜负 nchar(2) collate Greek_CS_AI     --用来模拟你原来数据库的排序规则
    )
    go
    insert into test
    select N'湖人',N'胜' union all
    select N'马刺',N'胜' union all
    select N'太阳',N'负' union all
    select N'马刺',N'负' union all
    select N'热火',N'胜' union all
    select N'湖人',N'胜' union all
    select N'太阳',N'负' union all
    select N'热火',N'负' 
    go
     
    --现在虽然原始列的排序规则是 Greek_CS_AI
    --而当前数据库的排序规则是Chinese_PRC_CI_AS,但数据照样能正常显示
    select *
    from test
    /*
    队伍 胜负
    湖人 胜 
    马刺 胜 
    太阳 负 
    马刺 负 
    热火 胜 
    湖人 胜 
    太阳 负 
    热火 负 
    */
     
      

  5.   

    代码修改一下
    SQL code?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 --在我的sql server 2008上 create table test (  队伍 varchar(6) collate Greek_CS_AI, --这个排序规则是随便选了一个的  胜负 char(2) collate Greek_CS_AI     --用来模拟你原来数据库的排序规则 ) go    insert into test select '湖人','胜' union allselect '马刺','胜' union allselect '太阳','负' union allselect '马刺','负' union allselect '热火','胜' union allselect '湖人','胜' union allselect '太阳','负' union allselect '热火','负' go       select * from test /* 队伍    胜负 ??    ?  ??    ?  ??    ?  ??    ?  ??    ?  ??    ?  ??    ?  ??    ?  */    --之所以显示出这样是由于你新的服务器上的排序规则是Chinese_PRC_CI_AS --所以就不能正常显示了。 --那怎么办呢?   --这个时候修改列的排序规则,或者把数据类型修改为nvarchar,也没什么效果 alter table test alter column 队伍 varchar(6) collate Chinese_PRC_CI_AS   alter table test alter column 胜负 char(2) collate Chinese_PRC_CI_AS   --显示还是不正常 select 队伍,        胜负                 from test  /* 队伍    胜负 ??    ?  ??    ?  ??    ?  ??    ?  ??    ?  ??    ?  ??    ?  ??    ?  */      drop table test   --通过nvarchar和nchar类型,能比较好的解决问题 create table test (  队伍 nvarchar(6) collate Greek_CS_AI, --这个排序规则是随便选了一个的  胜负 nchar(2) collate Greek_CS_AI     --用来模拟你原来数据库的排序规则 ) go     insert into test select N'湖人',N'胜' union allselect N'马刺',N'胜' union allselect N'太阳',N'负' union allselect N'马刺',N'负' union allselect N'热火',N'胜' union allselect N'湖人',N'胜' union allselect N'太阳',N'负' union allselect N'热火',N'负' go    --现在虽然原始列的排序规则是 Greek_CS_AI --而当前数据库的排序规则是Chinese_PRC_CI_AS,但数据照样能正常显示 select * from test /* 队伍    胜负 湖人    胜  马刺    胜  太阳    负  马刺    负  热火    胜  湖人    胜  太阳    负  热火    负  */  万分感谢前辈,如此细腻的阐述,下班回家试试!
      

  6.   


    谢谢,按你的做法问题可以解决,我回头再看下以后是不是创建表,字段数据类型后不会都要加
    collate Chinese_PRC_CI_AS这个吧?这样就麻烦了点,应该有对整个数据库设置一下就可以吧