SQL字符串是否以空值终止?

fud*_*din 4 sql

我正在学习如何使用len()功能.当我发现一个有12个字符的单元格的长度时,它给了我结果12.现在我认为SQL字符串无效终止(好像它们本来len()应该已经返回13而不是12)?

请帮帮我.

谢谢

小智 11

好吧,首先 - len函数不依赖于null终止,不使用null终止的编程语言ALSO有一个len函数.

因此,SQL中的len函数将为您提供字符串的长度作为服务器存储它 - 您关心它是如何工作的?

实际上它可能不会被终止,因为这会使字符串在多个数据库页面上分割变得困难.即使 - 这将严重依赖于实现(并且您没有说出您的意思是哪种产品 - SQL语言没有说明服务器如何在内部存储字符串).

所以,最后你的问题完全无关紧要.所有相关的是len函数实现与内部存储兼容.


Cad*_*oux 6

在SQL Server中,LEN将忽略尾随空格(http://msdn.microsoft.com/en-us/library/ms187403.aspx) - 这是来自该链接的修改示例:

PRINT 'Testing with ANSI_PADDING ON'
SET ANSI_PADDING ON ;
GO

CREATE TABLE t1
    (
     charcol CHAR(16) NULL
    ,varcharcol VARCHAR(16) NULL
    ,varbinarycol VARBINARY(8)
    ) ;
GO
INSERT  INTO t1
VALUES  ('No blanks', 'No blanks', 0x00ee) ;
INSERT  INTO t1
VALUES  ('Trailing blank ', 'Trailing blank ', 0x00ee00) ;

SELECT  'CHAR' = '>' + charcol + '<'
       ,'VARCHAR' = '>' + varcharcol + '<'
       ,varbinarycol
       ,LEN(charcol)
       ,LEN(varcharcol)
       ,DATALENGTH(charcol)
       ,DATALENGTH(varcharcol)
FROM    t1 ;
GO

PRINT 'Testing with ANSI_PADDING OFF' ;
SET ANSI_PADDING OFF ;
GO

CREATE TABLE t2
    (
     charcol CHAR(16) NULL
    ,varcharcol VARCHAR(16) NULL
    ,varbinarycol VARBINARY(8)
    ) ;
GO
INSERT  INTO t2
VALUES  ('No blanks', 'No blanks', 0x00ee) ;
INSERT  INTO t2
VALUES  ('Trailing blank ', 'Trailing blank ', 0x00ee00) ;

SELECT  'CHAR' = '>' + charcol + '<'
       ,'VARCHAR' = '>' + varcharcol + '<'
       ,varbinarycol
       ,LEN(charcol)
       ,LEN(varcharcol)
       ,DATALENGTH(charcol)
       ,DATALENGTH(varcharcol)
FROM    t2 ;
GO

DROP TABLE t1
DROP TABLE t2
Run Code Online (Sandbox Code Playgroud)