我正在学习如何使用len()
功能。当我发现一个包含12个字符的单元格的长度时,它给出了结果12.现在我认为SQL字符串无效终止(好像它们本来就是len()
应该返回13而不是12) ?
请帮帮我。
由于
答案 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,那么答案取决于所讨论的语言。
有几点值得记住:
SQL中有两种字符类型:CHAR(N)
和VARCHAR(N)
。前者总是长度相同(N
)并用空格填充;后者是可变长度的(最多N
个字符)。
在Transact-SQL中,LEN
返回字符串的长度,不包括尾随空格。
答案 3 :(得分:3)
在某些SQL字符串中以零结尾。 在某些SQL上,它们具有前导长度的字节/字。
这当然对len()函数无关紧要 但是如果要在字符串中插入\ 0,确实很重要。
通常varchar有一个前导长度字节。 但是char终止了。