一个数据库里一个字段用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
我还换了一下位置,也就是互相转化是没有问题的
并且上面那种外键也能访问,这样会不会有什么问题?
如 User (userId varchar(128) ......)
AAA (userId nvarchar(128) ......)
并且关键 一个是主键,一个是外键我做了下面测试,没有什么问题啊。declare @a varchar(100)
set @a='喹 别墅 kljsdfljl'declare @b nvarchar(100)
set @b=@aselect @a
我还换了一下位置,也就是互相转化是没有问题的
并且上面那种外键也能访问,这样会不会有什么问题?
包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。所输入的数据字符长度可以为零。varchar(n)
长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长度可以为零。
varchar占一个字节最好用nvarchar 插入的时候加N N'汉字'
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中文处理