Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Sự khác biệt về cách xử lý khoảng trắng giữa Oracle và SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng NEWSEQUENTIALID () để tạo HƯỚNG DẪN Tăng dần trong SQL Server

  2. Trả lại danh sách các cột được tính toán trong SQL Server

  3. HIỂN THỊ TẤT CẢ dữ liệu ngày giữa hai ngày; nếu không có hàng nào tồn tại cho ngày cụ thể thì hiển thị số 0 trong tất cả các cột

  4. Chia một phân vùng thành hai trong SQL Server (T-SQL)

  5. Cập nhật SQL với row_number ()