Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Różnica w obsłudze przestrzeni między Oracle a SQL Server

Przeprowadziłem eksperyment dotyczący obsługi przestrzeni między Oracle a SQL Server, ponieważ zauważyłem różnicę podczas korzystania z Oracle w mojej pracy.
(Wersja Oracle to Oracle 19c, a wersja SQL Server to SQL Server 2019, ponieważ zostały one już zainstalowane na moim komputerze.)

Eksperyment

Wyrocznia

Przeprowadziłem eksperyment pod poniższą tabelą i danymi.

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

Spacja po łańcuchu wydaje się być ignorowana, gdy typem kolumny jest Char.
Jednak w przypadku Varchar2 spacja po lub przed ciągiem nie wydaje się być ignorowana.
Szczegóły są następujące
https://docs.oracle.com/cd/B13789_01/server.101/b10759/sql_elements002.htm#:~:text=Nonpadded%20Comparison%20Semantics,-Oracle%20compares%20two&text=If%20two%20wartości%20of% 20 różnych,%20wartości%20są%20uważane za%20równe.

Serwer SQL

Podobnie jak w przypadku Oracle, przeprowadziłem eksperyment pod poniższą tabelą i danymi na serwerze 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

Wynik Char jest taki sam jak Oracle.
Jednak w przypadku Varchar wynik jest inny dla Oracle i SQL Server, spacje po lub przed ciągiem wydają się być ignorowane.

W związku z tym należy pamiętać, gdy używasz varchar ze względu na różnicę między Oracle a SQL Server jako taką powyżej.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Grupy dostępności programu SQL Server AlwaysOn:instalacja i konfiguracja, część 2

  2. Zmiana kolumny:null na not null

  3. Sprawdź, czy tabela ma DEFAULT ograniczenie w SQL Server za pomocą OBJECTPROPERTY()

  4. Uzyskaj znak między pierwszymi 2 znakami specjalnymi w SQL

  5. Przedstawiamy nową funkcję — replikację Spotlight w chmurze