我正在學習如何使用len()
函數。當我發現有12個字符的單元格的長度時,它給了我12的結果。現在我在想,SQL字符串空終止了(就好像他們會那麼len()
應該返回13而不是12)?SQL字符串空終止?
請幫我一把。
感謝
我正在學習如何使用len()
函數。當我發現有12個字符的單元格的長度時,它給了我12的結果。現在我在想,SQL字符串空終止了(就好像他們會那麼len()
應該返回13而不是12)?SQL字符串空終止?
請幫我一把。
感謝
嗯,首先 - len函數不依賴於空終止,不使用空終止也有LEN功能的工作原理編程語言。
因此,SQL中的len函數會給你字符串的長度作爲服務器存儲它 - 你關心的是如何工作?
實際上,它可能不會被空終止,因爲這會使得很難在多個數據庫頁面上拆分字符串。即使 - 這將會嚴重依賴於實現(並且你不會說你的意思是哪種產品--SQL語言沒有說明服務器如何在內部存儲字符串)。
所以,最後你的問題是完全不相關的。所有相關的是len函數實現與內部存儲兼容。
如果我們正在談論純SQL,那麼您不需要擔心NUL終止符。如果我們正在通過其他語言(例如C)與SQL進行交互,那麼答案取決於所討論的語言。
有幾個值得記住的相關要點:
有在SQL兩種字符類型:CHAR(N)
和VARCHAR(N)
。前者長度始終相同(N
),並填充空格;後者是可變長度的(最多N
個字符)。
在Transact-SQL中,LEN
返回字符串的長度,不包括尾隨空格。
在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
在某些SQL字符串中以零結尾。 在某些SQL中,它們具有前導長度的字節/字。
這對len()函數無關緊要。
但是它確實很重要,如果你想插入\ 0到字符串。
通常,varchar具有前導長度字節。 但char被終止。
什麼語言?蟒蛇? Visual Basic?其他? –
@Michael我認爲語言是TSql – Magnus