sql >> Databáze >  >> RDS >> Sqlserver

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. Sdružování připojení databáze Celery Worker

  2. Jak mohu spočítat počet řádků, které vrátil dotaz MySQL?

  3. Minimální protokolování pomocí INSERT…SELECT do tabulek haldy

  4. SQLT v 12c Can't Gather Stats