Tôi đã tiến hành một thử nghiệm về việc xử lý khoảng trắng giữa Oracle và SQL Server vì nhận thấy sự khác biệt khi sử dụng Oracle cho công việc của mình.
(Phiên bản của Oracle là Oracle 19c và phiên bản của SQL Server là SQL Server 2019 vì những phiên bản này đã được cài đặt trong PC của tôi.)
Thử nghiệm
Oracle
Tôi đã tiến hành một thử nghiệm theo bảng và dữ liệu sau.
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
Khoảng trắng sau chuỗi dường như bị bỏ qua khi kiểu colomn là Char.
Tuy nhiên, trong trường hợp của Varchar2, khoảng trắng sau hoặc trước chuỗi dường như không bị bỏ qua.
Chi tiết là sau đây
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% 20 khác nhau,% 20values% 20are% 20considered% 20equal.
Máy chủ SQL
Như trường hợp tương tự đối với Oracle, tôi đã tiến hành một thử nghiệm theo bảng và dữ liệu sau trên 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
Kết quả của Char giống như Oracle.
Tuy nhiên, trong trường hợp Varchar, kết quả là khác nhau giữa Oracle và SQL Server, các khoảng trắng sau hoặc trước chuỗi dường như bị bỏ qua.
Do đó, cần lưu ý khi sử dụng varchar vì sự khác biệt giữa Oracle và SQL Server như trên.