sql >> データベース >  >> RDS >> Sqlserver

SQL ServerのLEN()とDATALENGTH()

    SQL Server(またはAzure)でT-SQLを使用する場合、LEN() およびDATALENGTH() 関数は同じ結果を返すことがよくありますが、常にそうとは限りません。これらの関数が、同じデータのように見えるものに対して完全に異なる結果を返す場合があります。これは、LEN()の方法に重要な違いがあるためです。 およびDATALENGTH() ここで説明するように、関数は機能します。

    まず、それぞれの簡単な定義を次に示します。

    LEN()
    末尾の空白を除く、指定された文字列式の文字数を返します。
    DATALENGTH()
    式を表すために使用されるバイト数を返します。

    「文字」と「バイト」に注意してください。また、「末尾の空白を除く」は1つだけに適用されることに注意してください。

    LEN()の違いを示す例を次に示します。 およびDATALENGTH()

    トレーリングブランク

    LEN()の違いの1つ およびDATALENGTH() 関数は、LEN() 関数除外 末尾の空白(末尾のスペース、タブなど)に対して、DATALENGTH() 含む 末尾の空白。 最後にある空白についてのみ話していることに注意してください 文字列の–先頭または途中ではありません。

    これがなしの例です 末尾の空白:

    SELECT 
        LEN('Lit') AS Len,
        DATALENGTH('Lit') AS DataLength;
    

    結果:

    Len  DataLength
    ---  ----------
    3    3   
    

    そして、これがの例です 末尾の空白:

    SELECT 
        LEN('Lit') AS Len,
        DATALENGTH('Lit') AS DataLength;
    

    結果:

    Len  DataLength
    ---  ----------
    3    4  
    

    ただし、先頭のスペースは両方の関数でカウントされます:

    SELECT 
        LEN('Lit') AS Len,
        DATALENGTH('Lit') AS DataLength;
    

    結果:

    Len  DataLength
    ---  ----------
    4    4         
    

    バイトと文字

    LEN()のもう1つの重要な違い およびDATALENGTH() それは、LEN() 関数は文字の数を返します 文字列で。一方、DATALENGTH() バイトの数を返します 式で。

    式のバイト数は必ずしも文字列の文字数と一致しないため、これは重要な違いです。 Unicode文字列を処理する場合、DATALENGTH() 2倍の文字数を返します。これは、Unicode文字列が1文字あたり2バイトを格納するためです。

    上記の例では、両方のLEN() およびDATALENGTH() Litという単語に対して同じ結果を返しました ( 3 )。ただし、データベースのクエリを開始すると、結果はデー​​タの保存方法によって異なります。たとえば、 varcharとして保存されている場合 、結果は同じになります。 nvarcharとして保存されている場合 DATALENGTH() 関数は2倍の文字数を返します。そして、それが言うように保存されている場合、 char(25)DATALENGTH() 正確に25文字を返します。

    次のクエリを実行してみましょう:

    SELECT 
        ArtistName, 
        LEN(ArtistName) AS Len,
        DATALENGTH(ArtistName) AS DataLength
    FROM Artists 
    WHERE ArtistName = 'Lit';
    

    このクエリの結果は、データの保存方法によって異なります。

    nvarchar(255)

    ArtistNameの場合 列にはデータがnvarchar(255)として格納されます :

    ArtistName  Len  DataLength
    ----------  ---  ----------
    Lit         3    6         
    

    varchar(255)

    その列をvarchar(255)に変更した場合 、次の結果が得られます:

    ArtistName  Len  DataLength
    ----------  ---  ----------
    Lit         3    3         
    

    char(25)

    その列をchar(25)に変更した場合 、次の結果が得られます:

    ArtistName                 Len  DataLength
    -------------------------  ---  ----------
    Lit                        3    25        
    
    >

    したがって、おそらくこれすべての教訓は、文字列の長さなどを取得しようとしたときに奇妙な結果が得られることに気付いた場合は、正しい関数を使用していることを確認することです。


    1. OracleODP.NETバージョンに依存しない代替

    2. Linux上のDelphiをSQLServerに接続する

    3. 検索条件に「%」が含まれる「%」を使用したSQL「LIKE」クエリ

    4. SQLクエリでのタイムゾーン変換