2010-05-27 17 views
11

Tôi vừa được thừa kế một dự án mà có mã tương tự như sau (chứ không phải đơn giản) ví dụ:Chuỗi tiền tố TSQL Chữ cái trên Chèn - Bất kỳ Giá trị nào này, hoặc Dự phòng?

DECLARE @Demo TABLE 
(
    Quantity INT, 
    Symbol NVARCHAR(10) 
) 

INSERT INTO @Demo (Quantity, Symbol) 
SELECT 127, N'IBM' 

quan tâm của tôi là với N trước chuỗi chữ.

Tôi hiểu rằng tiền tố N là để chỉ định mã hóa (trong trường hợp này là Unicode). Nhưng kể từ khi lựa chọn chỉ là để chèn vào một lĩnh vực rõ ràng là đã Unicode, sẽ không giá trị này được tự động upcast?

Tôi đã chạy mã không có N và có vẻ như hoạt động, nhưng tôi có thiếu thứ gì đó mà lập trình viên trước đó dự định không? Hoặc là N một sự giám sát trên/phần của mình?

Tôi mong đợi hành vi tương tự như khi tôi chuyển một số int đến trường decimal (tự động phát). Tôi có thể loại bỏ những số N đó không?

Trả lời

9

thử nghiệm của bạn là không thực sự có giá trị, hãy thử một cái gì đó giống như một nhân vật Trung Quốc thay vào đó, tôi nhớ nếu bạn không tiền tố nó nó sẽ không chèn ký tự chính xác

Ví dụ, một đầu tiên cho thấy một dấu hỏi trong khi phía dưới một cho thấy một hình vuông

select '作' 

select N'作' 

một ví dụ tốt hơn, ngay cả ở đây đầu ra không giống

declare @v nvarchar(50), @v2 nvarchar(50) 

select @v = '作', @v2 = N'作' 

select @v,@v2 

Kể từ khi những gì bạn trông giống như là một bảng chứng khoán tại sao y ou sử dụng unicode, thậm chí còn có bất kỳ cái nào và cái này bao gồm ISIN, CUSIPS và SEDOLS

+0

Bảng tôi tạo là tiểu thuyết thuần túy. Tôi vừa đưa ra một ví dụ với khái niệm đầu tiên xuất hiện trong tâm trí của tôi (luận án của tôi lén lút vào cuộc sống công việc của tôi!). Tôi cũng chưa thấy một biểu tượng bảo mật trong Unicode. Về các nhân vật nước ngoài, bạn tạo nên một điểm tuyệt vời. Tôi chạy qua một cái gì đó tương tự trong khi cố gắng để nghiên cứu này từ Joel -> http://www.joelonsoftware.com/articles/Unicode.html – SethO

+0

Đối với một số lý do API Python cho SQL Server chỉ trả về dấu gạch chéo ngược khi tôi cố gắng sử dụng một trong những SELECT các câu lệnh. –

3

Có, SQL Server sẽ tự động chuyển đổi (mở rộng, bỏ xuống) varchar thành nvarchar, để bạn có thể loại bỏ N trong trường hợp này. Tất nhiên, nếu bạn đang chỉ định một chuỗi ký tự nơi các ký tự không thực sự có mặt trong collation mặc định của cơ sở dữ liệu, thì bạn cần nó.

Giống như bạn có thể thêm một số có chữ "L" trong C et al để biểu thị chữ số dài thay vì chữ int. Viết N'IBM 'hoặc là chính xác hoặc một thói quen nô lệ, tùy thuộc vào quan điểm của bạn.

Một bẫy cho người không tự nguyện: nvarchar không tự động được chuyển đổi thành varchar và điều này có thể là vấn đề nếu ứng dụng của bạn là tất cả Unicode và cơ sở dữ liệu của bạn không. Ví dụ, chúng tôi đã có điều này với các tài xế jTDS JDBC, mà ràng buộc tất cả các giá trị tham số như nvarchar, dẫn đến báo cáo một cách hiệu quả như thế này:

select * from purchase where purchase_reference = N'AB1234' 

(nơi purchase_reference là một cột VARCHAR)

Kể từ khi chuyển đổi tự động chỉ có một cách, điều đó đã trở thành:

select * from purchase where CONVERT(NVARCHAR, purchase_reference) = N'AB1234' 

và do đó chỉ mục của purchase_reference không được sử dụng.

Ngược lại, ngược lại là tốt: nếu purchase_reference là một nvarchar, và một ứng dụng thông qua trong một tham số varchar, sau đó truy vấn viết lại:

select * from purchase where purchase_reference = CONVERT(NVARCHAR, 'AB1234') 

sẽ là tốt. Cuối cùng, chúng tôi đã phải vô hiệu hóa các tham số ràng buộc như Unicode, do đó gây ra một loạt các vấn đề i18n được coi là ít nghiêm trọng.

+0

Đồng nghiệp của tôi đã kể những câu chuyện tương tự về những rắc rối giữa một ứng dụng sử dụng Unicode và cơ sở dữ liệu không có. Cảm ơn các ví dụ và giải thích. – SethO

Các vấn đề liên quan