SQL Server中VARCHAR(MAX)和NVARCHAR(MAX)使用时要注意的问题(转载)
在Microsoft SQLServer2005及以上的版本中,对于varchar(n)、nvarchar(n)和varbinary(n)有了max的扩展。可以使用如:varchar(max)、nvarchar(max)和varbinary(max)的大值数据类型来存储最多2^30-1个字节的数据。
这几个数据类型在行为上和较小的数据类型 varchar、nvarchar 和 varbinary 相同。
微软的说法是用这个数据类型来代替之前的text、ntext 和 image 数据类型,它们之间的对应关系为:
varchar(max)-------text;
nvarchar(max)-----ntext;
varbinary(max)----image.
有了大值数据类型之后,在对大值数据操作的时候要比以前灵活的多了。比如:之前text是不能用‘like’的,有了varchar(max)之后就没有这些问题了,因为varchar(max)在行为上和varchar(n)上相同,所以,可以用在varchar的都可以用在varchar(max)上。
以varchar为例,varchar支持8000字符,Text支持2GB字符,但是,替换函数在编写出来的时候,就对TEXT数据类型不起作用。
Update TableName Set DocuMent=REPLACE(DocuMent,String1,String2) /*此行将报错*/
同样也对CHARINDEX或者SUBSTRING不起作用——或者至少是他们在超过8千个字符的情况下不起作用。更进一步地讲,如果开发人员忘了处理TEXT或者IMAGE类型的本地变量,则实际上不支持任何操作。即使是简单地更新一个文档中的一个子字符串都需要用到很多的东西,以及难以使用的类似READTEXT和WRITETEXT的函数。
SQL Server 2005引入了一系列新的被称为max的数据类型(或者说是参数类型)。这是varchar、nvarchar 和 varbinary类型的扩展,这几种类型以前被限制在8000字节以下。max可以容纳高达2GB的数据,与TEXT和IMAGE一样——并且完全兼容所有的SQL Server内置的字符串函数。
用max关键字定义一个某种max类型的变量与替代字符串的尺寸(为varchar、nvarchar的时候)或者字节(为varbinary的时候)一样简单。
DECLARE @BigString varchar(max)
SET @BigString = 'abc'
虽然这个变量可以自由地操纵,并且可以传递给任何的内置的字符串函数,兼容性仍然不是没有问题。首先,开发人员不能期望指定了尺寸的varchar和nvarchar变量在达到8000个字节的极限的时候可以自动“升级”到max版本。例如,如下的批处理:
DECLARE @String1 varchar(4001)
DECLARE @String2 varchar(4001)
SET @String1 = REPLICATE('', 4001)
SET @String2 = REPLICATE('', 4001)
SELECT LEN(@String1 + @String2)
4001+4001=8002,但是指定了尺寸的varchar(n)的极限是8000。因为这两个变量中没有一个是max类型,LEN函数的结果就是8000,不是8002。在将两个变量连接的时候,一种简单的修正方法就是声明这两个变量中的一个为varchar(max)或者将其中的一个变量进行转换。与一个规定了尺寸的类型进行连接的时候,优先考虑max类型,最终结果是max类型。所以,以下批处理的结果是8002,正如我们期望的一样:
DECLARE @String1 varchar(4001)
DECLARE @String2 varchar(4001)
SET @String1 = REPLICATE('', 4001)
SET @String2 = REPLICATE('', 4001)
SELECT LEN(CONVERT(varchar(max), @String1) + @String2)
在传递给字符串函数的时候,开发人员意识到字符串的原意在默认情况下是规定了尺寸的,而不是max类型,也是至关重要的。例如,以下查询的结果就很令人惊奇:
SELECT LEN(REPLICATE('', 8002))
因为字符串‘1’是被作为规定了尺寸的varchar对待,而不是varchar(max),结果就是8000——但是在SQL Server 2005中,REPLICATE函数能够产生高达2GB的字符串。要修正这个问题,可以将字符串转换为varchar(max),这样函数就会输出同样的类型了:
SELECT LEN(REPLICATE(CONVERT(varchar(max), ''), 8002))
这个查询现在将会返回期望的结果:8002。记住,总是要对采用了新特性编写的代码进行非常仔细的测试。隐藏的问题,例如上面描述的问题,可能并且毫无疑问地会在最坏的时间里造成灾难性的后果。
除了变量之外,max类型也可以用于定义表的字段:
CREATE TABLE BigStrings (BigString varchar(max))
当用于表的时候,意识到max类型具有与TEXT和IMAGE类型稍微不同的行溢出行为是非常重要的。在SQL Server中,最大的行尺寸是8060字节。要超过这个限制,并且仍然管理每个都拥有高达2GB的存储,用TEXT和IMAGE类型存储的数据会被存储引擎自动地断行,在行里只留下一个16字节的指针。这意味着行的尺寸是减少了,这对性能有好处。然而,检索大数据是昂贵的,因为它不是与同一行的数据存放在同一个位置。
max数据类型在默认情况下,使用TEXT/IMAGE溢出行为和正常尺寸的varchar/varbinary类型的行为的混合方式。如果一个字段的数据,加上表中所有其他字段的数据,总量少于8060字节,数据就存放在行内。如果数据超过8060字节,max字段的数据就会存放在行外。对于大字符串的表,以下的行将会与表中的其他数据存储在同一个数据页内:
INSERT BigStrings (BigString) VALUES (REPLICATE('', 8000))
--But the following row will result in an overflow:
INSERT BigStrings (BigString) VALUES (REPLICATE(CONVERT(varchar(max), ''), 100000))
你可以更改max数据类型在每个表的基础上的默认的行为,它们会表现得和TEXT和IMAGE类型一样。这是通过使用sp_tableoption 存储过程中的“大数值类型在行外”选项实现的。为了修改大字符串表以将max类型的处理方式变得与TEXT和IMAGE数据类型的处理方式相同,可以使用如下的T-SQL:
EXEC sp_tableoption
'BigStrings',
'large value types out of row',
''
扩展:
既然是以max有这么多灵活性,一些数据库设计师将会被引诱以下列的方式开始定义表:
CREATE TABLE Addresses(
Name varchar(max),
AddressLine1 varchar(max),
AddressLine2 varchar(max),
City varchar(max),
State varchar(max),
PostalCode varchar(max)
)
我建议你最好不要这样做,一个企业应用中的数据模型既应该包含有具有实际限制的字段,还要给程序设计师提供有关字段尺寸的指导文档。像这样的表又该创建什么样的文档呢?
总知,max标记的数据类型为SQL Server 2005及之后版本处理大数据增加了很大部分的灵活性,但在使用中需要自己根据需求选择字段类型。
SQL Server中VARCHAR(MAX)和NVARCHAR(MAX)使用时要注意的问题(转载)的更多相关文章
- SQL Server中数据库文件的存放方式,文件和文件组 (转载)
简介 在SQL SERVER中,数据库在硬盘上的存储方式和普通文件在Windows中的存储方式没有什么不同,仅仅是几个文件而已.SQL SERVER通过管理逻辑上的文件组的方式来管理文件.理解文件和文 ...
- SQL Server 中VARCHAR(MAX)变量赋值引起的性能问题。
案例环境: 操作系统版本 : Windows Server 2008 R2 Standard SP1 数据库版本 : Microsoft SQL Server 2012 (SP1) - 11. ...
- SQL Server中,varchar和nvarchar如何选择
正常情况下,我们使用varchar也可以存储中文字符,但是如果遇到操作系统是英文操作系统并且对中文字体的支持不全面时, 在SQL Server存储中文字符为varchar就会出现乱码(显示为??). ...
- SQL Server中varchar和nvarchar的区别
varchar(n) 长度为 n 个字节的可变长度且非 Unicode 的字符数据.n 必须是一个介于 1 和 8,000 之间的数值.存储大小为输入数据的字节的实际长度,而不是 n 个字节.nvar ...
- SQL Server 中怎么查看一个字母的ascii编码或者Unicode编码(转载)
在sql中怎么查看一个字符的ascii编码或Unicode编码: SELECT ASCII('a') AS [AsciiNum]--字符获取ASCII码 SELECT UNICODE(N'a') AS ...
- SQL Server中的“最大并行度”的配置建议
SQL Server中的最大并行度(max degree of parallelism)如何设置呢? 设置max degree of parallelism有什么好的建议和指导方针呢?在微软官方文档R ...
- SQL Server中Text和varchar(max)数据类型区别
SQL Server中Text和varchar(max)数据类型区别 以前只知道text和image是可能被SQL Server淘汰的数据类型,但具体原因不太清楚,今天读书的时候发现了text与v ...
- SQL Server中Text和varchar(max) 区别
SQL Server 2005之后版本:请使用 varchar(max).nvarchar(max) 和 varbinary(max) 数据类型,而不要使用 text.ntext 和 image 数据 ...
- Sql server中的 nvarchar(max) 到底有多大?(转载)
问题: SQL server中的nvarchar(max)最大的长度是4000个字吗? 如果字段的内容超过4000个字时用什么类型呢?text 还是binary?他们的最大长度是多少?比如字段放的是长 ...
随机推荐
- Elasticsearch 在 7.X版本中去除type的概念
背景说明 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库. El ...
- k8s集群搭建(一)
k8s简介 kubernetes,简称K8s,是用8代替8个字符“ubernete”而成的缩写.是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简 ...
- idea 2019 集成activiti, idea activiti 新建bpmn文件, 解决idea activiti中文乱码
idea 在线安装activiti插件 1. File-->Settings 2. 点击Plugins, 右侧界面点击Marketplace后在搜索框搜索 actiBPM 注: 网络原因没有加载 ...
- tf–idf算法解释及其python代码
tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...
- Gym - 102056C(2018EC final) -Heretical … Möbius ——CRT
题意 给出一个长为200的01序列,判断是否在前1e9个莫比乌斯*值中.(这里的莫比乌斯值加了绝对值) 分析 意到因为4的倍数一定是0,9的倍数一定是0……169的倍数一定是0.那么我们可以对4,9, ...
- Ansible常用模块整理
问答题 请总结今天所学的ansible模块,以及各个模块的作用! ping ping模块用来检查目标主机是否在线 例子:ansible webserver -m ping yum yum模块用来在Ce ...
- Pandas | 14 统计函数
统计方法有助于理解和分析数据的行为.可以将这些统计函数应用到Pandas的对象上. pct_change()函数 系列,DatFrames和Panel都有pct_change()函数.此函数将每个元素 ...
- IIS 报错 Cannot open database "test4" requested by the login. The login failed. Login failed for user 'IIS APPPOOL\test1'.
报错: Cannot open database "test4" requested by the login. The login failed. Login failed fo ...
- matplotlib折线图
绘制折线图:参考https://baijiahao.baidu.com/s?id=1608586625622704613 (3)近10年GDP变化的曲线图,及三次产业GDP变化的曲 ...
- HTML5 - websocket的应用 之 简易聊天室
需要知识点: 前端知识 jq操作dom nodejs socket.io 关于websocket api的知识点,见上篇章<HTML5-Websocket>. 聊天室思路/原理: A和B聊 ...