1.设计表时如何使用char 与 varchar? 请写出你对varchar(max)的理解。

1.设计表时如何使用char 与 varchar? 请写出你对varchar(max)的理解。

char:是定长的,也就是当你输入的字符小于你指定的数目时,会在后面补空值。比如定义char(10),你输入的字符小于10时,它会再后面补空值。当你输入的字符大于10时,它会截取超出的字符,总之都会占10个字节的空间。char存储定长数据很方便,char字段上的索引效率极高,因为是固定长度,所以速度效率高。一个英文字符占一个字节,一个汉字两个字节。(由于char是以固定长度的,所以它的速度会比varchar快得多!但程序处理起来要麻烦一点,要用trim之类的函数把两边的空格去掉!)

nvarchar(n):包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。最多可存储4000个字符,无论英文还是汉字都占2个字符。

varchar:如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 Varchar(10)是最合算的。存储变长数据,所以不以空格填满,但存储效率没有CHAR高。Varchar类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。  最多8000个英文,4000个汉字。

varchar一般适用于英文和数字,Nvarchar适用中文和其他字符。

sqlserver中varchar最大长度是8000,但是可以使用varchar(max),可以达到2G。(解释:数据库文件由区组成的,而区由八个物理上连续的页组成,页是SQL中存储数据的基础单位,数据就记录存在数据页。一个页大小为8K(8192字节),数据库中的数据文件(.mdf 或.ndf)分配的磁盘空间可以从逻辑上划分成页(从 0 到 n 连续编号)。磁盘 I/O 操作在页级执行,也就是说,SQL Server 每次读取或写入数据的最少数据单位是数据页。数据页由页头(96字节),数据行,行偏移量(最少36个字节)三部分组成,所以数据行的最大长度是8x1024-96-36-7=8060,7表示SQL Server还需要对每一行的数据最少附加7字节的系统数据。)

varchar(max):

在MSSQL2005及以上的版本中,加入大值数据类型(varchar(max)、nvarchar(max)、varbinary(max))。大值数据类型最多可以存储2^30-1个字节的数据。
这几个数据类型在行为上和较小的数据类型 varchar、nvarchar 和 varbinary 相同。
微软的说法是用这个数据类型来代替之前的text、ntext 和 image 数据类型,它们之间的对应关系为:
varchar(max)-------text;
nvarchar(max)-----ntext;
varbinary(max)----image.

varchar(max):字符串被截断

replicate('str',n):辅助n个str字符串

declare @test varchar(max)
set @test=replicate('1',9000)
print len(@test)
 
解决办法
(1)使用强制转换

set @test=replicate(convert(varchar(max),'1'),9000)--强制转换为varchar(max)。
print len(@test)
(2)把9000个字符拆分成2个部分,每个部分都少于8000
set @test=replicate(convert(varchar(max),'1'),4000)+replicate(convert(varchar(max),'1'),5000)
print len(@test)
在sql server ssms中使用select 查询结果,非XML格式默认1行最多只允许存在65535个字符,而print 一行只能输出8000个字符。所以要输出查看内容可以将结果内容另存为csv文件。
也可以把结果数据转成XML格式,代码如下:

SELECT CAST('<A><![CDATA[' + CAST(@test as nvarchar(max)) + ']]></A>' as xml)
 参考:http://blog.csdn.net/z10843087/article/details/77584905
           http://www.bubuko.com/infodetail-1883338.html
总结:

  1,两个不超过8000长度的“字符串自身”相加,相加之后默认总长度是不超过8000的,如果相加之后的长度超过8000,超过8000的部分会被截断

原理:(字符串默认是char型,char型最大为8000字符,所以想加超过8000会被截断)

    2,相加的两个字符串中有一个长度超过了8000,相加两个字符串本身之后的结果是不会被截断的。

原理:(因为超过8000的字符串默认用varchar(max)/text来临时存储了,最大可以存2^31-1,所以可以容纳超过8000的)

    3,不管字符串长度如何,将字符串赋值给varchar(max)变量之后,用“变量相加”的方式相加,赋值给第三个varchar(max)变量,其结果是不会被截断的。

所以:当无法预计相加的两个字符串本身的长度是多少,以及相加之后的长度是多少的时候,

   请不要直接对两个字符串本身进行相加(+)操作,为了确保万无一失,请将字符串赋值给varchar(max)变量之后,用变量相加,因为用变量相加的方式总是会没有问题的。(或者把字符串强行数据类型成varchar(max)或者text一类)

• 比较:

1.定长或变长

所谓定长就是长度固定,当要保存的数据长度不够时将自动在其后面填充英文空格,使长度达到相应的长度;有var前缀的,表示是实际存储空间是动态变化的,比如varchar,nvarchar变长字符数据则不会以空格填充。

2.Unicode或非Unicode

数据库中,英文字符只需要一个字节存储就足够了,但汉字和其他众多非英文字符,则需要两个字节存储。如果英文与汉字同时存在,由于占用空间数不同,容易造成混乱,导致读取出来的字符串是乱码。Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。而前缀n就表示Unicode字符,比如nchar,nvarchar,这两种类型使用了Unicode字符集。

3.几种数据类型的存储的最大容量

char,varchar 最多8000个英文,4000个汉字

nchar,nvarchar  最多可存储4000个字符,无论英文还是汉字

sql server dba常用概念、操作分析char,varchar,nvarchar,varchar(max)的更多相关文章

  1. SQL Server中常用的SQL语句(转):

    SQL Server中常用的SQL语句 转自:http://www.cnblogs.com/rainman/archive/2013/05/04/3060428.html 1.概述 名词 笛卡尔积.主 ...

  2. 【SQL Server DBA】维护语句:删除并创建外键约束、获取建表语句

    原文:[SQL Server DBA]维护语句:删除并创建外键约束.获取建表语句 1.删除外键约束,建立外键约束 先建立3个表: /* drop table tb drop table tb_b dr ...

  3. 【SQL Server DBA】日常巡检语句3:特定监控(阻塞、top语句、索引、作业)

    原文:[SQL Server DBA]日常巡检语句3:特定监控(阻塞.top语句.索引.作业) 1.查询阻塞信息.锁定了哪些资源 --1.查看阻塞信息 select spid,loginame,wai ...

  4. 一名小小的SQL Server DBA想谈一下SQL Server的能力

    一名小小的SQL Server DBA想谈一下SQL Server的能力 百度上暂时还没有搜索到相关的个人写的比较有价值的文章,至少在中文网络的世界里面没有 但是在微软的网站有这样一篇文章:<比 ...

  5. 2年SQL Server DBA调优方面总结

    原文:2年SQL Server DBA调优方面总结 2年SQL Server DBA调优方面总结 当2年dba 我觉得,有些东西需要和大家分享探讨,先书单. 书单 1.<深入解析SQL Serv ...

  6. 处理SQL Server 异常常用步骤

    处理SQL Server 异常常用步骤 SQL Server常见的问题主要是SQL问题造成,常见的主要是CPU过高和阻塞. 一.CPU过高的问题 1.查询系统动态视图查询执行时间长的sql语句 WIT ...

  7. [转]2年SQL Server DBA调优方面总结

      2年SQL Server DBA调优方面总结 当2年dba 我觉得,有些东西需要和大家分享探讨,先书单. 书单 1.<深入解析SQL Server 2008 系列> 这个就是mssql ...

  8. sql server dba概念系列引用

    原文转自:https://www.cnblogs.com/gaochundong/p/everyone_is_a_dba_sqlserver_architecture.html <人人都是 DB ...

  9. SQL Server DBA日常检查常用SQL

    .数据库 --所有数据库的大小 exec sp_helpdb --所有数据库的状态 select name, user_access_desc, --用户访问模式 state_desc, --数据库状 ...

随机推荐

  1. Bugly最简单的配置方法

    1,注册Bugly帐号 2.项目 build.gradle 中配置 compile 'com.tencent.bugly:crashreport:latest.release'//其中latest.r ...

  2. 《shiro框架》

    20170929 shiro授权流程学习 shiro-filter执行流程 CacheManager(shiro缓存管理) JEESITE登录流程简单梳理 shiro与springMVC整合 shir ...

  3. PHP域名解析(一个IP绑多域名)----看看可以,并不值得借鉴

    PHP域名解析(一个IP绑多域名)----看看可以,并不值得借鉴 好处当然是不用买多网卡.不用设置其它端口为WEB端口了,一张网卡上.都用同一个80端口建很多网站. 假设有三个域名:     [url ...

  4. 【SpringCloud微服务实战学习系列】配置详解

    前言 Spring Boot针对常用的开发场景提供了一系列自动化配置来减少原本复杂而又几乎很少改动的模板化配置内容. 一.配置文件 Spring Boot的默认配置文件位置为src/main.reso ...

  5. swagger环境搭建

    下面所用工具下载   http://editor.swagger.io/#/  demo   一.安装 swagger editor   说明:安装swagger前需要安装node工具   工具安装 ...

  6. laravel with 渴求式加载指定字段

    在使用 Laravel 的关联查询中,我们经常使用 with 方法来避免 N+1 查询,但是 with 会将目标关联的所有字段全部查询出来,对于有强迫症的我们来说,当然是不允许的. 这时候我们可以使用 ...

  7. [工具] CuteMarkEd

    CuteMarkEd 是一款开源免费的.支持代码高亮的.朴素的 Markdown 本地编辑器,支持 Windows.Linux. 就因为程序员喜欢用,然后就拼命的开发 Markdown 编辑器么?青小 ...

  8. block 的细节和本质

    案例1: 普通的局部变量,block内部只会引用它初始的值(block定义那一刻),不能跟踪它的改变 输出:1 案例2: block内部能够一直引用被__block修饰的变量 输出:2 案例3: bl ...

  9. TensorFlow softmax的互熵损失

    函数:tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None) 功能:这个函数的作用是计算 logits 经 softmax ...

  10. Oracle体系结构之控制文件管理

    控制文件作用:记录了数据库的结构和行为,有多少个数据文件,日志文件及其位置名称,状态,维护数据库的一致性,即记录了数据库的启动SCN号和终止SCN号. 控制文件的位置和个数记录在参数文件中,通常控制文 ...