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. iptraf:一个实用的TCP/UDP网络监控工具

    iptraf是一个基于ncurses的IP局域网监控器,用来生成包括TCP信息.UDP计数.ICMP和OSPF信息.以太网负载信息.节点状态信息.IP校验和错误等等统计数据. 它基于ncurses的用 ...

  2. Illegal mix of collations for operation 'concat'

    在t_employee表中,练习使用concat函数连接字符串时, mysql> select concat('工号为:',fnumber,'的员工的幸福指数:',fsalary/(fage-2 ...

  3. Andoid数据存储之SQLite数据库

    SQLite是一个嵌入式的并且是一个轻量级的数据库: SQLite数据库支持大部分SQL语法, 允许使用SQL语句操作数据库, 其本质是一个文件, 不需要安装启动: SQLite数据库打开只是打开了一 ...

  4. Thinkphp 去除bom头 解决模版空输出问题

    <?php if (isset($_GET['dir'])){ //config the basedir $basedir=$_GET['dir']; }else{ $basedir = '.' ...

  5. Java连接SqlServer2008数据库

    Java连接SqlServer2008数据库 首先下载JDBC:下载地址:http://www.microsoft.com/zh-cn/download/details.aspx?id=21599 下 ...

  6. WP8.1学习系列(第二十一章)——本地应用数据

    了解如何存储和检索本地应用数据存储中的设置和文件. 路线图: 本主题与其他主题有何关联?请参阅: 使用 C# 或 Visual Basic 的 Windows 运行时应用的路线图 使用 C++ 的 W ...

  7. Java 反编译工具 —— JAD 的下载地址(Windows版/Linux版/Mac OS 版)

    Java 反编译工具 —— JAD 的下载地址. 各种版本哦! Windows版,Linux版,Mac OS 版,等等 下载地址: http://varaneckas.com/jad/

  8. Elasticsearch学习之深入搜索五 --- phrase matching搜索技术

    1. 近似匹配 什么是近似匹配,两个句子 java is my favourite programming language, and I also think spark is a very goo ...

  9. [原]git的使用(二)---工作区和暂存区

    接着上篇 git的使用(一) http://www.cnblogs.com/horizonli/p/5323363.html 6.工作区和暂存区(中转站) 工作区(Working Directory) ...

  10. 【转】Openstack中oslo_config模块学习

    OpenStack的项目貌似越来越多了,在Grizzly版之前,每个项目都得实现一套处理配置文件的代码.在每个项目的源码中基本上都可以找到openstack/common/cfg.py,inipars ...