MSSQLServer中的varchar和Nvarchar有什么区别?

这是别人写的
这里我谈谈自己的理解:
假如我们有个字段我定义为nvarchar(50) signature ,这个字段对应到APP端 比如iOS就是,用户的个人介绍,我们最大的字数限制就是50个字,做过APP的同学就知道了,这里最多就可以放50个字符,不管是汉字还是英文都是50个字,因为客户端是utf8编码的,所以我们假如用结构体传输的话我们可以定义这样一个结构体

struct userInfo {
 char signature[201];  
}

这里我们使用了201个字节,原因是这里有可能50个字符,都是4个字节的emoji(utf8编码的),这是有可能的,所以我们定义了201个,当然我多加1位就是预留结尾符.
这里的201个字节存入数据库肯定是需要转换的,我们需要将utf8 转为Unicode编码,当然这里有点复杂,我不打算这里讲了。
下面我在说详细点,假如signature 保存了"Hello!"
,APP在内存中保存的是这样的(APP 是utf8编码):
0x48 0x65 0x6C 0x6C 0x6F 0x21(utf8 编码 英文使用1个字节编码),
传输的时候signature 就是6个字节,服务端收到后需要把它转成Unicode变成这样
0x0048 0x0065 0x006C 0x006C 0x006F 0x0021也就是
48 00 65 00 6C 00 6C 00 6F 00 21 00,可以看到我们多个字节去表示同一个字符。
同理反过来的话,我们从数据库拿出来的也是这样的,我们需要转成utf8给客户端,这里我截取部分代码给你看看

_variant_t variant; // 这里从结果集赋值的
wchar_t unicodeTmp[101] = { 0 };
char utf8Tmp[201] = {0};
memcpy(unicodeTmp, variant.pcVal, wcslen((wchar_t*)variant.puiVal) > 50 ? 50 * sizeof(wchar_t) : wcslen((wchar_t*)variant.puiVal)*sizeof(wchar_t));
vector vcName;
if (Unicode2UTF(vcName, unicodeTmp))
{
memset(pRes->szNickName, 0, sizeof(pRes->szNickName));
memcpy(utf8Tmp, &*vcName.begin(), vcName.size() > sizeof(utf8Tmp) ? sizeof(utf8Tmp) : vcName.size());
}
}

结合这里例子我相信,大家应该可以理解了,这里的utf8Tmp就是给客户端的

最后总结下,nvarchar 和 nchar的区别在于是不是定长的,varchar和Nvarchar ,区别在于是否是用两个字节存储一个字符。

你可能感兴趣的:(MSSQLServer中的varchar和Nvarchar有什么区别?)