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

时间:2011-10-02 13:14:02

标签: sql

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

请帮帮我。

由于

4 个答案:

答案 0 :(得分:11)

嗯,首先 - len函数不依赖于null终止,不使用null终止的编程语言ALSO有一个len函数,它可以工作。

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

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

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

答案 1 :(得分: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

答案 2 :(得分:4)

如果我们谈论的是纯SQL,那么你就不用担心NUL终止符了。如果我们正在谈论从其他语言(例如C)接口SQL,那么答案取决于所讨论的语言。

有几点值得记住:

  1. SQL中有两种字符类型:CHAR(N)VARCHAR(N)。前者总是长度相同(N)并用空格填充;后者是可变长度的(最多N个字符)。

  2. 在Transact-SQL中,LEN返回字符串的长度,不包括尾随空格

答案 3 :(得分:3)

在某些SQL字符串中以零结尾。 在某些SQL上,它们具有前导长度的字节/字。

这当然对len()函数无关紧要 但是如果要在字符串中插入\ 0,确实很重要。

通常varchar有一个前导长度字节。 但是char终止了。