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

SQL Server trả về ??? khi cột được cập nhật bằng các ký tự tiếng Thái

Không có nhiều thông tin được cung cấp trong câu hỏi. Tất cả những gì chúng tôi biết là:

  • Cột đang sử dụng Đối chiếu của Thai_CI_AS (ít nhất là có vẻ như câu hỏi đang nói rõ)
  • Các ký tự tiếng Thái đang được chuyển sang
  • Những gì được lưu trữ trong cột là:???

Tuy nhiên, chỉ từ đó chúng ta có thể suy ra hai điều:

  1. Chuỗi đến không phải là NVARCHAR tham số / biến, cũng không phải là một ký tự chuỗi được đặt trước bằng chữ hoa "N",

  2. Đối chiếu mặc định cho DB trong đó truy vấn đang được thực thi (không nhất thiết là DB trong đó Bảng tồn tại) là không một đối chiếu tiếng Thái.

Chúng tôi không biết cột đích có phải là VARCHAR hay không hoặc NVARCHAR , nhưng điều đó không quan trọng nếu đối chiếu của cột là đối chiếu tiếng Thái (vì điều đó sẽ cho phép VARCHAR dữ liệu để lưu giữ các ký tự tiếng Thái và NVARCHAR sẽ hoạt động bất kể).

Nếu một trong hai :

  • chuỗi đến sử dụng NVARCHAR tham số (hoặc nếu chuỗi là chữ, thì tiền tố bằng chữ hoa "N"),

    hoặc

  • truy vấn được thực thi trong một DB có Đối chiếu mặc định của Thái

thì các ký tự tiếng Thái sẽ được lưu trữ như mong đợi.

Ví dụ sau đây thể hiện hành vi này. Tôi sử dụng Ký tự Thái Khomut U + 0E5B trên một trường hợp có Korean_100_CS_AS_KS_WS_SC Đối chiếu mặc định cấp phiên bản. Cột đích có Đối chiếu của Thai_CI_AS . Đầu tiên, mặc dù DB "hiện tại" là một DB không có một Collation mặc định của Thái Lan, tôi thêm ký tự hai lần:một lần có tiền tố là "N" và một lần không có tiền tố trên chuỗi chữ:

USE [tempdb];
-- DROP TABLE #Thai;
CREATE TABLE #Thai (ID INT IDENTITY(1, 1), Col1 VARCHAR(50) COLLATE Thai_CI_AS);

-- In a DB with a non-Thai default Collation:
INSERT INTO #Thai (Col1) VALUES ('๛');
INSERT INTO #Thai (Col1) VALUES (N'๛');

Tiếp theo, tôi chuyển sang DB hiện có Đối chiếu mặc định của Thái Lan và chỉ chèn chuỗi không có tiền tố (thực tế không cần kiểm tra lại chuỗi có tiền tố "N"):

USE [other_db];

-- In a DB with a Thai default Collation:
INSERT INTO #Thai (Col1) VALUES ('๛');


SELECT * FROM #Thai;

Kết quả là:

ID  Col1
1   ?
2   ๛
3   ๛

Như bạn thấy (điểm # bên dưới liên quan đến ID # trong kết quả ở trên):

  1. Chuỗi có tiền tố không phải "N", được sử dụng trong DB bằng đối chiếu mặc định không phải tiếng Thái, đã được dịch sang ?
  2. Chuỗi có tiền tố "N", cũng được sử dụng trong DB bằng Cách sử dụng đối chiếu mặc định không phải tiếng Thái, đã lưu trữ giá trị một cách chính xác
  3. Chuỗi có tiền tố không phải "N", được sử dụng trong DB có Đối chiếu mặc định của Thái Lan, đã lưu trữ giá trị một cách chính xác



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MSSQL:cập nhật các hàng phù hợp từ tệp đã tải lên

  2. Coi cột là loại khác nhau để sắp xếp

  3. Cách liên kết cơ sở dữ liệu Access với SQL Server trong Access 2016

  4. Chọn các hàng và Cập nhật các hàng giống nhau để khóa?

  5. tạo MULTIPLE tổng hợp nhóm con