提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|使用教程|编辑:莫成敏|2020-03-11 14:46:31.980|阅读 251 次
概述:在SQL Server中创建表时,没有充分的理由将ANSI_PADDING设置为OFF。它纯粹是为具有代码的旧数据库提供的,该代码假定使用旧的CHAR行为来处理填充,现在已经不赞成使用它了。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
相关链接:
SQL Prompt是一款实用的SQL语法提示工具。它根据数据库的对象名称、语法和代码片段自动进行检索,为用户提供合适的代码选择。自动脚本设置使代码简单易读--当开发者不大熟悉脚本时尤其有用。本文介绍了不要创建将ANSI_PADDING设置为OFF的列。
查找永久更改表中某些数据类型检索方式的连接设置,这有点奇怪,但是如果在创建临时或永久表时使用SET ANSI_PADDING OFF,就会发生这种情况。在创建表时,由于设置不当,或者偶然使用带有DBLib连接的旧应用程序,这会导致表中的某些列从那时起奇怪地或不一致地处理某些字符串或二进制数据类型的尾随空格。
此选项已被弃用,在某些时候,它将被删除(它将始终为“on”)。SQL Prompt具有不赞成使用的语法规则DEP013,它将警告您使用此选项以及其他不赞成使用的SET选项。
什么是ANSI填充?为什么?
在SQL的早期,如何处理字符串的问题引起了争议。定义和固定字符串长度的CHAR数据类型旨在使数据检索简单而有效。字符串以指定的长度存储在CHAR数据类型中。对于较短的字符串,数据类型中所有剩余的字符位置都用空格(CHAR)或零(BINARY)填充。这些填充空格是字符串的一部分吗?如果不是,您如何区分故意填充空格的值和自动填充的值?
SQL的早期实现通常在检索数据时修剪掉CHAR中的所有尾随空格,除非该列是NOT NULL。但是,很明显,为了符合ANSI SQL标准,必须对此进行更改。NIST测试套件检查是否始终填充CHAR数据类型,并且对于CHAR或VARCHAR数据类型,用户输入的尾随空格都不会被截断。SQL Server决定,为了遵守规则,将随数据一起检索任何尾随空格(无论是故意还是作为填充自动添加的),对于二进制数据类型的尾随零也是如此。但是,由于在旧的体制下编写了太多代码,因此Transact-SQL中引入了一种称为ANSI_PADDING的设置。当它关闭时,它允许此旧代码照常工作。似乎每个人都很高兴。
一旦有关CHAR数据类型的ANSI-ISO标准争议平息下来,就会引入新的数据类型和新的表类型。ANSI_PADDING争议仅影响当时存在的类型,而用户为此目的定义的长度。现在可以将字符串存储为NVARCHAR、VARCHAR、NCHAR或CHAR的定义大小。二进制数据可以存储为BINARY或VARBINARY的定义大小。对于CHAR(n)、BINARY(n)、VARCHAR(n)或VARBINARY(n)的较早数据类型,在创建表时ANSI_PADDING选项的设置会影响SQL Server随后处理这些字符串的方式。
但是,后来的NCHAR、NVARCHAR、NTEXT、TEXT或IMAGE数据类型并非如此。未定义长度的类型VARBINARY(MAX)、VARCHAR(MAX)和NVARCHAR(MAX)也不受影响。
旧数据库开发人员真正需要关闭ANSI填充的唯一用途是无需使用该RTRIM()功能即可进行字符串连接。避免必须使用RTRIM()函数似乎是个好主意,但是填充规则的行为与有可空列的行为不一致。另外,随着新类型的表的引入,没有人愿意使它们向后兼容,因此适用的规则通常在ANSI_PADDING关闭时对表变量根本不起作用。同样,如果您尝试在计算列或索引视图上创建或更改索引,则很可能会陷入困境。如果您将ANSI_PADDING设置为OFF,则根本不允许这样做。
那么,规则是什么?
ANSI标准的简单行为是,对于固定宽度类型插入的数据,总是用尾随空格或零填充到指定长度,然后,对于所有数据类型,任何尾随空格或零都被视为数据的一部分,依此类推。当SQL Server将数据检索到内存时,将永远不会修剪它们。
如果在创建表和列时将ANSI_PADDING切换为OFF,则行为将变得更加复杂。幸运的是,是否存在尾随空格不会影响WHERE子句中的字符串比较,因为无论设置什么,这些始终会忽略它们。它也不会对比较产生很大的影响。关闭ANSI_PADDING的主要效果如下:
如果您需要说服力,我们可以证明所有这些。
您会看到以下消息:
使用ANSI_PADDING ON创建一个临时表结果是这样的:
正确的。与往常一样,在创建表时将ANSI_PADDING设置为ON,我们故意添加尾随空格或零的第一行就不会被裁剪。没有尾随空格的第二行被一致地添加为CHAR和BINARY数据类型,无论是否允许NULL。
第二个结果来自关闭ANSI_PADDING时创建的表。可为空的第一个CHAR列已被修剪。具有NOT NULL约束的CHAR列用空格填充。无论是否可以为空,VARBINARY列都修剪了尾随零。VARCHAR列修剪了尾随空格。
第三个结果来自一个表变量,该变量也是通过将ANSI_PADDING设置为OFF来创建的,该设置完全无害。无论设置如何,它的行为都与ANSI兼容。
如果您正在努力接受所有规则和例外,那么您并不孤单。
查找使用ANSI_PADDING关闭创建的异常列
在访问表时,无论您对ANSI_PADDING进行了何种设置,查询行为都是一致的。该设置将保留在表列中,而连接设置将被忽略。无论使用何种连接设置访问“旧版”数据库,该数据库都能始终如一地运行。我们可以通过查询元数据来检查临时表发生了什么。
USE tempdb SELECT S.name AS TheColumn, Object_Schema_Name(S.object_id) + '.' + Object_Name(S.object_id) AS TableName, is_ansi_padded FROM sys.columns AS S INNER JOIN sys.tables AS t ON t.object_id = S.object_id WHERE system_type_id IN (165, 167, 173, 175) AND is_ansi_padded = 0; --ansi padding off!!
sys.columns视图中的列如果ANSI_PADDING处于打开状态,则为1;如果关闭,则为0。该查询将非常快速地告诉您数据库是否有设置为ANSI_PADDING off的异常列(只需去掉第一行“USE tempdb”)。
结论
除非有人最终有意或无意关闭ANSI_PADDING的危险消失,否则在从SQL Server中最终删除该功能之前,请始终在执行表CREATE语句之前使用SET ANSI_PADDING ON设置与ANSI行为的连接,但在其他任何地方都不应使用的设置,因为该设置和支持已计划弃用,此时您将无法关闭ANSI兼容性。
本教程内容到这里就完结了,感兴趣的朋友可以继续关注慧都网了解更多产品资讯~您也可以下载SQL Prompt试用版免费体验~
相关内容推荐:
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@cahobeh.cn
文章转载自:本文探讨 SQL Server 中 NULL 和空值之间的区别,并讨论如何有效地处理它们。
Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。
DevExpress v24.2帮助文档正式发布上线了,请按版本按需下载~
本教程将向您展示如何用MyEclipse构建一个Web项目,欢迎下载最新版IDE体验!
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@cahobeh.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢