2011-10-02 90 views
3

我正在學習如何使用len()函數。當我發現有12個字符的單元格的長度時,它給了我12的結果。現在我在想,SQL字符串空終止了(就好像他們會那麼len()應該返回13而不是12)?SQL字符串空終止?

請幫我一把。

感謝

+0

什麼語言?蟒蛇? Visual Basic?其他? –

+0

@Michael我認爲語言是TSql – Magnus

回答

11

嗯,首先 - len函數不依賴於空終止,不使用空終止也有LEN功能的工作原理編程語言。

因此,SQL中的len函數會給你字符串的長度作爲服務器存儲它 - 你關心的是如何工作?

實際上,它可能不會被空終止,因爲這會使得很難在多個數據庫頁面上拆分字符串。即使 - 這將會嚴重依賴於實現(並且你不會說你的意思是哪種產品--SQL語言沒有說明服務器如何在內部存儲字符串)。

所以,最後你的問題是完全不相關的。所有相關的是len函數實現與內部存儲兼容。

4

如果我們正在談論純SQL,那麼您不需要擔心NUL終止符。如果我們正在通過其他語言(例如C)與SQL進行交互,那麼答案取決於所討論的語言。

有幾個值得記住的相關要點:

  1. 有在SQL兩種字符類型:CHAR(N)VARCHAR(N)。前者長度始終相同(N),並填充空格;後者是可變長度的(最多N個字符)。

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

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 
3

在某些SQL字符串中以零結尾。 在某些SQL中,它們具有前導長度的字節/字。

這對len()函數無關緊要。
但是它確實很重要,如果你想插入\ 0到字符串。

通常,varchar具有前導長度字節。 但char被終止。