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

OracleとSQLServerのスペースの処理の違い

    Oracleを仕事に使用したときの違いに気づいたので、OracleとSQLServerの間のスペースの処理について実験を行いました。
    (OracleのバージョンはOracle 19cであり、SQLServerのバージョンはSQLServer 2019です。これらは、すでにPCにインストールされているためです。)

    実験

    オラクル

    以下の表とデータで実験を行いました。

    CREATE TABLE CompareTestTable
    (
         Seq         NUMBER
        ,ColCHAR     CHAR(10)
        ,ColVARCHAR  VARCHAR2(10)
    );
    
    INSERT INTO CompareTestTable VALUES( 1, 'aaa',  'bbb'  );       -- No space
    INSERT INTO CompareTestTable VALUES( 2, 'aaa ', 'bbb ' );       -- A space after a string
    INSERT INTO CompareTestTable VALUES( 3, ' aaa', ' bbb' );       -- A space before a string
    INSERT INTO CompareTestTable VALUES( 4, ' aaa ', ' bbb ' );     -- Spaces after and before a string
    
    select * from CompareTestTable where ColCHAR = 'aaa';       -- Hit SEQ=1,2 records
    select * from CompareTestTable where ColCHAR = 'aaa ';      -- Hit SEQ=1,2 records
    select * from CompareTestTable where ColCHAR = ' aaa';      -- Hit SEQ=3,4 records
    select * from CompareTestTable where ColCHAR = ' aaa ';     -- Hit SEQ=3,4 records
    
    select * from CompareTestTable where ColVARCHAR = 'bbb';    -- Hit SEQ=1 record
    select * from CompareTestTable where ColVARCHAR = 'bbb ';   -- Hit SEQ=2 record
    select * from CompareTestTable where ColVARCHAR = ' bbb';   -- Hit SEQ=3 record
    select * from CompareTestTable where ColVARCHAR = ' bbb ';  -- Hit SEQ=4 record
    

    colomnタイプがCharの場合、文字列の後のスペースは無視されるようです。
    ただし、Varchar2の場合、文字列の後または前のスペースは無視されていないようです。
    詳細は以下の通りです
    https://docs.oracle.com/cd/B13789_01/server.101/b10759/sql_elements002.htm#:~:text=Nonpadded%20Comparison%20Semantics、-Oracle%20compares%20two&text =If%20two%20values%20of% 20異なる、%20values%20are%20considered%20equal。

    SQL Server

    Oracleの場合と同じように、SQLServerの次の表とデータで実験を行いました。

    CREATE TABLE CompareTestTable
    (
         Seq         INT
        ,ColCHAR     CHAR(10)
        ,ColVARCHAR  VARCHAR(10)
    )
    INSERT INTO CompareTestTable VALUES( 1, 'aaa',  'bbb'  );       -- No space
    INSERT INTO CompareTestTable VALUES( 2, 'aaa ', 'bbb ' );       -- A space after a string
    INSERT INTO CompareTestTable VALUES( 3, ' aaa', ' bbb' );       -- A space before a string
    INSERT INTO CompareTestTable VALUES( 4, ' aaa ', ' bbb ' );     -- Spaces after and before a string
    
    select * from CompareTestTable where ColCHAR = 'aaa';       -- Hit SEQ=1,2 records
    select * from CompareTestTable where ColCHAR = 'aaa ';      -- Hit SEQ=1,2 records
    select * from CompareTestTable where ColCHAR = ' aaa';      -- Hit SEQ=3,4 records
    select * from CompareTestTable where ColCHAR = ' aaa ';     -- Hit SEQ=3,4 records
    
    select * from CompareTestTable where ColVARCHAR = 'bbb';    -- Hit SEQ=1,2 records
    select * from CompareTestTable where ColVARCHAR = 'bbb ';   -- Hit SEQ=1,2 records
    select * from CompareTestTable where ColVARCHAR = ' bbb';   -- Hit SEQ=3,4 records
    select * from CompareTestTable where ColVARCHAR = ' bbb ';  -- Hit SEQ=3,4 records
    

    Charの結果はOracleと同じです。
    ただし、Varcharの場合、結果はOracleとSQL Serverで異なり、文字列の後または前のスペースは無視されるようです。

    したがって、上記のOracleとSQL Serverの違いにより、varcharを使用する場合は注意が必要です。


    1. PostgreSQLの日付から日を取得する

    2. MySQL条件付き挿入

    3. ミリ秒の精度のタイムスタンプ:MySQLでそれらを保存する方法

    4. MySQLまたはMariaDBサーバーの本番環境への準備-パート2-