一个数据库里一个字段用varchar(128)而和它关联的另一个表的字段用nvarchar(128)
如 User (userId varchar(128)  ......)
   AAA  (userId nvarchar(128) ......)
并且关键 一个是主键,一个是外键我做了下面测试,没有什么问题啊。declare @a varchar(100)
set @a='喹 别墅 kljsdfljl'declare @b nvarchar(100)
set @b=@aselect @a
我还换了一下位置,也就是互相转化是没有问题的
并且上面那种外键也能访问,这样会不会有什么问题?

解决方案 »

  1.   

    如果你在数据库里建立了外键关系,sql server 会提示你两个类型不同,不能建立FOREIGN KEY 你必须把两个字段类型建成一样如果不在数据库里建立外键,那只要数据相同,问题倒是没多大
      

  2.   

    varcahr和Nvarcahr区别
      

  3.   

    存储汉字,分别用varchar(128)和nvarchar(128)来try try,看能存储的数来那个一样不~
      

  4.   

    nvarchar(n)
    包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。所输入的数据字符长度可以为零。varchar(n)
    长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长度可以为零。
      

  5.   

    nvarchar 是unicode 占两个字节
    varchar占一个字节最好用nvarchar  插入的时候加N  N'汉字'
      

  6.   

    如上所述,在指定Chinese_PRC_CI_AS为默认排序规则的情况下,char/varchar使用cp936编码,也可以存储中文。但个人建议是,char/varchar只用以存储ASCII字符,对于包含大于127的非ASCII字符的字符串,统一用nchar/nvarchar存储。这样,不但可以支持多语言,不会造成其他语言的字符遗失,而且可以避免许多计算上的问题。例如:DECLARE @str varchar(100)
    SET @str = '1234567一二三四五六七'
    SELECT LEN(@str)               --14
    SELECT LEFT(@str,10)           --1234567一二三
    DECLARE @col varchar(10)
    SET @col = LEFT(@str,10)
    SELECT @col                    --1234567一
    倘若在char/varchar中包含了中文字符,SQLServer的字符串函数(包括LEN、LEFT/RIGHT、SUBSTRING、 STUFF、CHARINDEX/PATINDEX)会把一个中文字符(双字节)作为一个字符处理,而定义变量或列时指定的数据类型char /varchar却是以字节为单位,结果则如上例,截取了一个字串的10个字符,却无法放入一个varchar(10)的变量或列中,这种违反直觉的不一致会给系统带来一些讨厌的BUG。参看:SQLServer中文处理