sql >> Databáze >  >> RDS >> Oracle

Rozdíl ve zpracování mezer mezi Oracle a SQL Server

Provedl jsem experiment o manipulaci s mezerami mezi Oracle a SQL Server, protože jsem si všiml rozdílu při používání Oracle pro svou práci.
(Verze společnosti Oracle je Oracle 19c a verze SQL Serveru je SQL Server 2019, protože tyto verze již byly nainstalovány v mém počítači.)

Experiment

Oracle

Provedl jsem experiment podle následující tabulky a dat.

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

Zdá se, že mezera za řetězcem je ignorována, když je typ sloupce Char.
Avšak v případě Varchar2 se zdá, že mezera za nebo před řetězcem není ignorována.
Detail je následující
https://docs.oracle.com/cd/B13789_01/server.101/b10759/sql_elements002.htm#:~:text=Nonpadded%20Comparison%20Semantics,-Oracle%20compares%20two&two%20val%20 20různé,%20hodnoty%20jsou%20považovány%20 za stejné.

SQL Server

Stejně jako v případě Oracle jsem provedl experiment podle následující tabulky a dat na 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

Výsledek Char je stejný jako u Oracle.
V případě Varchar se však výsledek mezi Oracle a SQL Serverem liší, mezery za nebo před řetězcem se zdá být ignorovány.

Proto je třeba si toho všimnout při použití varchar kvůli rozdílu mezi Oracle a SQL Server jako takovým výše.


  1. Nové rodiny procesorů AMD se dobře porovnávají s novými procesory Intel

  2. Příklady SUBTIME() – MySQL

  3. SQL vyberte max(datum) a odpovídající hodnotu

  4. Nelze načíst ID posledního vloženého řádku v režimu spánku pomocí Oracle