一、 试验归类
测试SQL:

drop table a
create table a(a varchar(2)) insert into a values('a')
insert into a values(N'a')
insert into a values('深圳')
insert into a values(N'深圳')
select a, len(a), datalength(a) from a drop table #a
create table a(a varchar(2)) insert into #a values('a')
insert into #a values(N'a')
insert into #a values('深圳')
insert into #a values(N'深圳')
select a, len(a), datalength(a) from #a
drop table a
create table a(a varchar(8000)) insert into a select REPLICATE('a', 8000)
insert into a select REPLICATE('深', 8000)
insert into a select REPLICATE(N'a', 8000)
insert into a select REPLICATE(N'深', 8000)
select a, len(a), datalength(a) from a

1. 字符集是支持双字节的字符集如中文字符集(Collation name为Chinese_PRC_CI_AS)

<1>. 定义varchar(2)

(1) 正式表
    总结:在中文字符集下,定义varchar(x),
     不论使用不使用N'',英文字符都占1个字节,即可以存x个英文字符;
     不论使用不使用N'',中文字符都占2个字节,即可以存(x / 2)个中文,select结果为汉字本身,不是乱码;
    
   (2) 临时表
    总结:在中文字符集下,定义varchar(x),
     和正式表表现一样;
  
<2>. 定义nvarchar(2)

(1) 正式表
    总结:在中文字符集下,定义nvarchar(x),
     不论使用不使用N'',英文字符都占2个字节,即可以存x个英文字符;
     不论使用不使用N'',中文字符都占2个字节,即可以存x个中文,select结果为汉字本身,不是乱码;
    
   (2) 临时表
    总结:在中文字符集下,定义nvarchar(x),
     和正式表表现一样;
    
<3>. 类型为varchar时,长度 x 和 datalength()对应,都指字节大小;
     英文len() = datalength();
     中文len() = datalength() / 2;
    
    类型为nvarchar时,长度 x 和 len()对应,都指字符长度;
   
2. 字符集是支持单字节的字符集如拉丁字符集(Collation name为Latin1_General_CI_AS)
  
<1>. 定义varchar(2)

(1) 正式表
    总结:在英文字符集下,定义varchar(x),
     不论使用不使用N'',英文字符都占1个字节,即可以存x个英文字符;
     不论使用不使用N'',中文字符都占1个字节,即可以存x个中文,但只保存前半截中文编码,所以select结果为乱码;
     (特殊:如果使用N'',此时插入的字符数最大为4000)
     英文和中文 len() = datalength();
    
   (2) 临时表
    总结:在英文字符集下,定义varchar(x),
     不论使用不使用N'',英文字符都占1个字节,即可以存x个英文字符;
     不使用N''时,中文占1个字节,可以存x个汉字,但都只存入汉字前半截字符编码,显示为乱码;
     使用N''时,中文占2个字节,只可以存 x/2 个汉字,没有乱码,取出仍为汉字,说明在英文字符集下通过使用N''是可以保存汉字的;
    
     除用N''保存的中文外,其余英文和中文 len() = datalength();
     用N''保存的中文字符len() = datalength() / 2;
    
<2>. 定义nvarchar(2)

(1) 正式表
    总结:在英文字符集下,定义nvarchar(x),
     不论使用不使用N'',英文字符都占2个字节,即可以存x个英文字符;(注意每个字符比varchar用的空间大)
     不论使用不使用N'',中文字符都占2个字节,即可以存x个中文字符,
     但不使用N''只保存前半截中文编码,所以select结果为乱码;
     使用N''则保存和取出都为汉字本身;
    
   (2) 临时表
    总结:在英文字符集下,定义nvarchar(x),
     和正式表表现相同;
    
<3>. 类型为varchar时,长度 x 和 datalength()对应,都指字节大小;
     (临时表中N''中文字符长度比较特殊;)
    类型为nvarchar时,长度 x 和 len()对应,都指字符长度;

二、 使用归类
抛开不常用的临时表不谈,只看正式表,再加上varchar和nvarchar类型的最大长度,得到以下经验:
<1> 最大长度问题
   1. 在中文字符集下使用varchar,最大长度可定义8000,这个8000是指字节数(datalength()),即最大可以保存8000个英文字符,4000个中文字符;
    特殊:若存入字符N'a',则最大能保存4000个字符,但其所占空间为4000字节;
   2. 在中文字符集下使用nvarchar,最大长度可定义4000,这个4000是指字符个数(len()),即最大可以保存4000个英文字符,4000个中文字符;

3. 在英文字符集下使用varchar,最大长度可定义8000,这个8000是指字节数(datalength()),由于中文英文都保存为1字节,故最大可以保存8000个英文、中文字符;
   4. 在英文字符集下使用nvarchar,最大长度可定义4000,这个4000是指字符个数(len()),即最大可以保存4000个英文字符,4000个中文字符;
<2> 文字显示问题
   1. N''要和数据类型nvarchar, nchar一起使用,如果对varchar, char字段类型强制使用N'',则会产生一些特殊现象,甚至无法控制;
   2. 在英文字符集下,想要保存特殊符号字符、中文等双字节字符,在定义表结构时要使用nvarchar或者nchar,在保存时要用N'';
   3. 在中文字符集下,数据库系统缺省已经可以保存特殊符号字符、中文等双字节字符。即使用不使用N'',都按双字节处理。但为了统一期间建议:
    在定义表结构时如果使用nvarchar或者nchar,在保存时要用N'',
    在定义表结构时如果使用varchar和char,此时不要使用N''操作;
   4. SUBSTRING ( expression , start , length )
    length:是一个整数,指定子串的长度(要返回的字符数或字节数)。
    中文字符集中按字符数取;
    英文字符集中,char, varchar按字节数取,nchar, nvarchar按字符数取;

三、 其他参考
使用 Unicode 数据
   unicode代码页、排序规则、SQL Server 排序规则基础知识、Windows 排序规则排序样式、选择 SQL 排序规则
DBCS 字符

SQL SERVER字符集的研究(中英文字符集,varchar,nvarchar).的更多相关文章

  1. 浅谈SQL Server、MySQL中char,varchar,nchar,nvarchar区别

    最近一次的面试中,被面试官问到varchar和nvarchar的区别,脑海里记得是定长和可变长度的区别,但却没能说出来.后来,在网上找了下网友总结的区别.在这里做个备忘录: 一,SQL Server中 ...

  2. Sql Server中Float格式转换字符串varchar方法(转)

    1.[Sql Server](70)  SELECT CONVERT(varchar(100), CAST(@testFloat AS decimal(38,2)))SELECT STR(@testF ...

  3. SQL Server 字符串拼接与拆分 string varchar Split and Join

    1.Split    SQL Server 2008 新语法: DECLARE @str VARCHAR(MAX) SET @str = REPLACE(@teeIDs, ',', '''),(''' ...

  4. SQL server 字段合并CAST(org_no AS VARCHAR(20))+CAST(page_no AS VARCHAR(20))+CAST(djlb_no AS VARCHAR(20)))

    sql server 字段合并(CAST) ---------------------- select (CAST(org_no AS VARCHAR(20))+CAST(page_no AS VAR ...

  5. 浅谈SQL Server数据内部表现形式

    在上篇文章 浅谈SQL Server内部运行机制 中,与大家分享了SQL Server内部运行机制,通过上次的分享,相信大家已经能解决如下几个问题: 1.SQL Server 体系结构由哪几部分组成? ...

  6. 设置与使用SQL Server的字符集(Collation,即排序规则)

    目录 目录 正确认识SQL Server的字符集 选择合适的SQL Server字符集 错误使用SQL Server的字符集 参考资料 正确认识SQL Server的字符集 SQL Server作为一 ...

  7. SQL Server 与MySQL中排序规则与字符集相关知识的一点总结

    字符集&&排序规则 字符集是针对不同语言的字符编码的集合,比如UTF-8字符集,GBK字符集,GB2312字符集等等,不同的字符集使用不同的规则给字符进行编码排序规则则是在特定字符集的 ...

  8. SQL Server中Text和varchar(max) 区别

    SQL Server 2005之后版本:请使用 varchar(max).nvarchar(max) 和 varbinary(max) 数据类型,而不要使用 text.ntext 和 image 数据 ...

  9. 五、Sql Server 基础培训《进度5-数据类型(知识点+实际操作)》

    知识点: ================================================= ============================================= ...

随机推荐

  1. QT获得所有系统环境变量(包括Linux和MAC的信息)

    系统环境变量还是挺重要的,除了QStandardPaths(感觉都是文档类型的变量,QT4使用QDesktopServices),更有QProcessEnvironment(都是真正的系统变量): Q ...

  2. 又拍云——图像处理师(GraphicsMagick、ImageMagick、FFmpeg)

    云处理平台开发工程师 工作地:杭州 岗位职责:负责云处理平台研发工作: 岗位要求: 扎实的 C 语言编程基础及算法优化能力: 至少能够熟练使用一门脚本语言(Python.Ruby.Lua 等)进行日常 ...

  3. 锐浪应用小插曲,asp.net下的使用

    下午提前完成了今天的工作内容,整了下bs中的应用,嘿嘿,其中遇到不少问题,接下来说下大概会遇到哪些问题,1:grid++ 6.0插件下载安装之后ie浏览器无法打开,居然什么都没有显示,奇葩啊,系统版本 ...

  4. Hdu 4010-Query on The Trees LCT,动态树

    Query on The Trees Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Othe ...

  5. ACM1019_最大公倍数

    /*问题说明 一组正整数的最小公倍数(LCM)是最小的正整数约数集合中的所有号码. 例如,5,7和15的最小公倍数是105. 输入 输入将包括多个问题的实例.输入的第一行中,将包含一个整数, 表示问题 ...

  6. Windows 安装Django并创建第一个应用

    学习python 也有一段时间了,语法也学得差不多了,突然就想学一学python的web开源开源框架Django,我用的是Django-1.6.2.tar.gz,可以在官网https://www.dj ...

  7. leetcode-WordLadder

    Word Ladder Total Accepted: 10243 Total Submissions: 58160My Submissions Given two words (start and  ...

  8. [RxJS] Filtering operator: single, race

    Single, race both get only one emit value from the stream. Single(fn): const source = Rx.Observable. ...

  9. java中的mmap实现--转

    什么是mmap mmap对于c程序员很熟悉,对于java程序员有点陌生.简而言之,将文件直接映射到用户态的内存地址,这样对文件的操作不再是write/read,而是直接对内存地址的操作. 在c中提供了 ...

  10. BootStrap table 传递搜索参数

    看bootStrap table文档不难发现它有一个queryparams属性,是向后台传递参数的,默认参数已有pageSize.pageIndex等,那么怎么传递自定义的参数呢?在网上找了好多也没有 ...