Ik heb een experiment uitgevoerd over het omgaan met de spaties tussen Oracle en SQL Server, omdat ik het verschil merkte bij het gebruik van Oracle voor mijn werk.
(De versie van Oracle is Oracle 19c en de versie van SQL Server is SQL Server 2019 omdat deze al op mijn pc waren geïnstalleerd.)
Experiment
Orakel
Ik voerde een experiment uit onder de volgende tabel en gegevens.
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
De spatie na tekenreeks lijkt te worden genegeerd wanneer het kolomtype Char is.
In het geval van Varchar2 lijkt de spatie na of voor de tekenreeks echter niet te worden genegeerd.
Het detail volgt
https://docs.oracle.com/cd/B13789_01/server.101/b10759/sql_elements002.htm#:~:text=Nonpadded%20Comparison%20Semantics,-Oracle%20compares%20two&text=If%20two%20values%20of% 20different,the%20values%20are%20considered%20equal.
SQL Server
Zoals hetzelfde geval voor Oracle, voerde ik een experiment uit onder de volgende tabel en gegevens op 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
Het resultaat van Char is hetzelfde als Oracle.
In het geval van Varchar is het resultaat echter anders tussen Oracle en SQL Server, de spaties na of vóór de tekenreeks lijken te worden genegeerd.
Let daarom op bij het gebruik van varchar vanwege het verschil tussen Oracle en SQL Server als zodanig hierboven.