sql >> Databasteknik >  >> RDS >> Sqlserver

Skillnad i hanteringen av utrymmena mellan Oracle och SQL Server

Jag genomförde ett experiment om hanteringen av utrymmena mellan Oracle och SQL Server eftersom jag märkte skillnaden när jag använde Oracle för mitt arbete.
(Oracles version är Oracle 19c och SQL Servers version är SQL Server 2019 eftersom dessa redan hade installerats på min PC.)

Experiment

Oracle

Jag genomförde ett experiment under följande tabell och data.

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

Mellanrummet efter strängen verkar ignoreras när kolumntypen är Char.
Men i händelse av Varchar2, tycks utrymmet efter eller före strängen inte ignoreras.
Detaljen följer
https://docs.oracle.com/cd/B13789_01/server.101/b10759/sql_elements002.htm#:~:text=Nonpadded%20Comparison%20Semantics,-Oracle%20compares%20two&text=If%20estwo%2%20 20olika,%20värdena%20 anses%20lika.

SQL Server

Som samma fall för Oracle genomförde jag ett experiment under följande tabell och data på 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

Resultatet av Char är detsamma som Oracle.
Men i händelse av Varchar är resultatet annorlunda mellan Oracle och SQL Server, mellanslagen efter eller före strängen verkar ignoreras.

Därför bör det noteras när du använder varchar på grund av skillnaden mellan Oracle och SQL Server som sådan ovan.


  1. Hur förhindrar jag att en databastrigger återkommer?

  2. Hur Exp()-funktionen fungerar i PostgreSQL

  3. Sammanfoga flera rader i en array med SQL på PostgreSQL

  4. Hur kan jag ställa in standardvärdet för en tidsstämpelkolumn till den aktuella tidsstämpeln med Laravel-migreringar?