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.