sql >> Database >  >> RDS >> Sqlserver

Verschil in het omgaan met de spaties tussen Oracle en SQL Server

Ik heb een experiment uitgevoerd over het omgaan met de spaties tussen Oracle en SQL Server, omdat ik het verschil merkte bij het gebruik van Oracle voor mijn werk.
(De versie van Oracle is Oracle 19c en de versie van SQL Server is SQL Server 2019 omdat deze al op mijn pc waren geïnstalleerd.)

Experiment

Orakel

Ik voerde een experiment uit onder de volgende tabel en gegevens.

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

De spatie na tekenreeks lijkt te worden genegeerd wanneer het kolomtype Char is.
In het geval van Varchar2 lijkt de spatie na of voor de tekenreeks echter niet te worden genegeerd.
Het detail volgt
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% 20different,the%20values%20are%20considered%20equal.

SQL Server

Zoals hetzelfde geval voor Oracle, voerde ik een experiment uit onder de volgende tabel en gegevens op SQL Server.

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

Het resultaat van Char is hetzelfde als Oracle.
In het geval van Varchar is het resultaat echter anders tussen Oracle en SQL Server, de spaties na of vóór de tekenreeks lijken te worden genegeerd.

Let daarom op bij het gebruik van varchar vanwege het verschil tussen Oracle en SQL Server als zodanig hierboven.


  1. Schending van UNIQUE KEY-beperking op INSERT WHERE COUNT(*) =0 op SQL Server 2005

  2. ORACLE Een spoel gebruiken met dynamische spoellocatie

  3. Installeer MySQL op Ubuntu 14.04

  4. Syntaxisaccentuering configureren in SQLcl