Sự khác biệt giữa varchar và nvarchar là gì?


1354

Có phải nó chỉ nvarcharhỗ trợ các nhân vật đa nhân? Nếu đó là trường hợp, thực sự có bất kỳ điểm nào, ngoài mối quan tâm lưu trữ, để sử dụng varchars?


6
Tôi thích quan điểm của incomudro, đó là điều khiến tôi tìm hiểu về sự khác biệt giữa varchar & nvarchar ở nơi đầu tiên. Ứng dụng Java của chúng tôi chống lại SQL Server db sử dụng myBatis, dường như gửi các chuỗi dưới dạng nvarchar theo mặc định (vẫn không chắc chắn làm thế nào (hoặc nếu) điều đó có thể bị quá tải). Một truy vấn đơn giản xuất hiện dưới dạng một vấn đề hiệu năng lớn vì tôi đã xác định cột mà nó đang chọn là varchar, không phải nvarchar và nó đã bỏ qua chỉ mục trên cột.
Sean Đọc

Câu trả lời:


1652

Một nvarcharcột có thể lưu trữ bất kỳ dữ liệu Unicode. Một varcharcột được giới hạn trong một bảng mã 8 bit. Một số người nghĩ rằng varcharnên được sử dụng vì nó chiếm ít không gian hơn. Tôi tin rằng đây không phải là câu trả lời chính xác. Sự không tương thích của Codepage là một nỗi đau và Unicode là cách chữa trị cho các vấn đề về codepage. Với đĩa và bộ nhớ giá rẻ hiện nay, thực sự không có lý do gì để lãng phí thời gian để tìm kiếm các trang mã nữa.

Tất cả các hệ điều hành và nền tảng phát triển hiện đại đều sử dụng Unicode trong nội bộ. Bằng cách sử dụng nvarcharchứ không phải varchar, bạn có thể tránh thực hiện chuyển đổi mã hóa mỗi khi bạn đọc hoặc ghi vào cơ sở dữ liệu. Chuyển đổi mất thời gian, và dễ bị lỗi. Và phục hồi từ các lỗi chuyển đổi là một vấn đề không hề nhỏ.

Nếu bạn đang can thiệp vào một ứng dụng chỉ sử dụng ASCII, tôi vẫn khuyên bạn nên sử dụng Unicode trong cơ sở dữ liệu. Các thuật toán đối chiếu cơ sở dữ liệu và hệ điều hành sẽ hoạt động tốt hơn với Unicode. Unicode tránh các vấn đề chuyển đổi khi giao tiếp với các hệ thống khác . Và bạn sẽ chuẩn bị cho tương lai. Và bạn luôn có thể xác thực rằng dữ liệu của bạn bị giới hạn ở ASCII 7 bit cho bất kỳ hệ thống cũ nào bạn phải duy trì, ngay cả khi tận hưởng một số lợi ích của việc lưu trữ Unicode đầy đủ.


8
Đây là thông tin tuyệt vời để có. Vì vậy, tôi có hiểu chính xác điều này không nếu tôi suy luận rằng sự lựa chọn cuối cùng trở thành một trong - tài nguyên nào rẻ hơn: bộ xử lý + chi phí phát triển hoặc lưu trữ?
Matt Cashatt

141
@MatthewPatrickCashatt - Bạn có thể thấy nó theo cách đó. Nhưng nếu bạn tưởng tượng một thế giới huy hoàng trong đó tất cả dữ liệu văn bản đều bằng Unicode và các nhà phát triển đơn giản là không bao giờ phải suy nghĩ về việc mã hóa thứ gì đó đang xảy ra và cả một lớp lỗi đơn giản không bao giờ xảy ra, thì bạn có thể thấy rằng có thực sự không có sự lựa chọn nào cả
Jeffrey L Whitledge


8
@Martin Smith - Trong những trường hợp đó, lợi thế nhỏ bé mà varchar tạo ra (lưu trữ nhỏ gọn) biến mất. Tôi đoán varchar thậm chí còn tồi tệ hơn tôi nghĩ!
Jeffrey L Whitledge

9
@PeterAllenWebb - Bạn có thể lưu trữ dữ liệu Unicode bất kỳ dữ liệu Unicode nào, bởi vì các cặp thay thế trong UTF-16 có thể được lưu trữ trong UCS-2 như thể chúng là các ký tự. Điều đó sẽ làm việc minh bạch cho việc lưu trữ và truy xuất dữ liệu. Bây giờ, những gì bạn không thể làm là có được các phép biến đổi và so sánh trường hợp đáng tin cậy bên ngoài BMP, nhưng tôi không đưa ra bất kỳ tuyên bố nào về điều đó. Vì vậy, nếu bạn có nhiều văn bản Desseret mà bạn muốn xử lý, tốt nhất nên làm điều đó bên ngoài cơ sở dữ liệu. Nhưng nó chỉ tốt để lưu trữ nó ở đó. (Tất nhiên, varchar cũng sẽ không giúp bạn ở đó!)
Jeffrey L Whitledge

259

varchar : Dữ liệu ký tự không phải là Unicode, có độ dài thay đổi. Đối chiếu cơ sở dữ liệu xác định trang mã nào dữ liệu được lưu trữ bằng cách sử dụng.

nvarchar : Dữ liệu ký tự Unicode có độ dài thay đổi. Phụ thuộc vào đối chiếu cơ sở dữ liệu để so sánh.

Được trang bị kiến ​​thức này, sử dụng bất kỳ cái nào phù hợp với dữ liệu đầu vào của bạn (ASCII v. Unicode).


5
Có một hạn chế như varchar không thể lưu trữ dữ liệu Unicode? Tất cả là 1 và 0. Tôi có thể lưu nội dung tiếng Trung dưới dạng varchar tốt cho DB của tôi. Tôi chỉ xác định UTF-8 của nó mặc dù. Làm thế nào mà làm việc đó ?
Nishant

3
@Nishant câu trả lời muộn : tất nhiên bạn có thể lưu trữ UTF-8 trong varchar nhưng nó sẽ phá vỡ các hàm chuỗi SQL Server. Nếu bạn thực hiện tất cả các tìm kiếm / chuyển đổi trong ứng dụng của mình thì có, bạn có thể làm điều đó (nhưng lợi ích là gì?). Chỉ mã hóa Unicode được SS hỗ trợ là UCS-2 (có, không phải UTF-16 trước SS2k16) và các hàm chuỗi của nó chỉ hoạt động với mã hóa đó. BTW thì sao? Nếu bạn muốn lưu trữ dữ liệu tùy ý, tốt hơn bạn nên sử dụng nhị phân thay thế.
Adriano Repetti

Vâng, nó chỉ phá vỡ các chức năng tìm kiếm chuỗi.
Nishant

8
Vì vậy, bạn biết ... nó không "hoạt động". Đó giống như lưu trữ một floatthành intvà đi, "cũng chắc chắn rằng các số thập phân đi mất tích." Chỉ không.
dùng7116

70

Tôi luôn sử dụng nvarchar vì nó cho phép mọi thứ tôi đang xây dựng có thể chịu được khá nhiều dữ liệu tôi ném vào nó. Hệ thống CMS của tôi làm tiếng Trung một cách tình cờ, vì tôi đã sử dụng nvarchar. Ngày nay, bất kỳ ứng dụng mới nào thực sự không nên quan tâm đến dung lượng cần thiết.


25
Ý tưởng rằng các ứng dụng mới không nên quan tâm đến các hạn chế về không gian là hơi thiển cận và bất kỳ ai đã xử lý cơ sở dữ liệu ở cấp độ doanh nghiệp từ trung bình đến lớn sẽ rất vui khi nói với bạn, hoàn toàn không chính xác.
Frater

60
Để tự do đưa các từ vào miệng của tags2k, tôi nghĩ rằng một tuyên bố chính xác hơn có thể là 'ngày càng khó có ứng dụng mới nào nên quan tâm đến không gian cần thiết hơn là vấn đề quốc tế hóa và các vấn đề khác về bộ ký tự'.
Cowan

1
"Ngày nay, bất kỳ ứng dụng mới nào thực sự không nên quan tâm đến dung lượng cần thiết." - Trừ khi bạn đang sử dụng bộ nhớ đám mây miễn phí, trong đó gói trả phí là một bước nhảy đáng tin cậy trong $ (xem các gói chia sẻ SQL Server của AppHarbor).
ganders

3
@ganders Hú! Bạn đang ở đó. Báo cáo tổng quát chỉ là tạm thời chính xác tốt nhất. Máy tính chắc chắn là một trò chơi đu dây và bùng binh. Tôi chắc chắn quan tâm đến việc tôi đang sử dụng bao nhiêu dung lượng trên Windows Azure CCP. Điều đó nói rằng tôi sẽ "không bao giờ" sử dụng varchar trên nvarchar. Ooo tôi chỉ mâu thuẫn với chính mình?
nghĩa

1
@rism, tôi tin rằng bạn đã loại bỏ mọi rủi ro mâu thuẫn với việc sử dụng dấu ngoặc kép của bạn "never", ít nhất là về mặt kỹ thuật.
Smandoli

30

Nó phụ thuộc vào cách Oracle được cài đặt. Trong quá trình cài đặt, tùy chọn NLS_CHARACTERSET được đặt. Bạn có thể tìm thấy nó với truy vấn SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET'.

Nếu NLS_CHARACTERSET của bạn là mã hóa Unicode như UTF8, thật tuyệt. Sử dụng VARCHAR và NVARCHAR khá giống nhau. Ngừng đọc ngay bây giờ, chỉ cần đi cho nó. Mặt khác, hoặc nếu bạn không có quyền kiểm soát bộ ký tự Oracle, hãy đọc tiếp.

VARCHAR - Dữ liệu được lưu trữ trong mã hóa NLS_CHARACTERSET. Nếu có các trường hợp cơ sở dữ liệu khác trên cùng một máy chủ, bạn có thể bị hạn chế bởi chúng; và ngược lại, vì bạn phải chia sẻ cài đặt.Một trường như vậy có thể lưu trữ bất kỳ dữ liệu nào có thể được mã hóa bằng cách sử dụng bộ ký tự đó và không có gì khác . Vì vậy, ví dụ nếu bộ ký tự là MS-1252, bạn chỉ có thể lưu trữ các ký tự như chữ cái tiếng Anh, một số ít chữ cái có dấu và một vài chữ cái khác (như € và -). Ứng dụng của bạn sẽ chỉ hữu ích với một vài địa phương, không thể hoạt động ở bất kỳ nơi nào khác trên thế giới. Vì lý do này, nó được coi là một ý tưởng tồi.

NVARCHAR - Dữ liệu được lưu trữ trong bảng mã Unicode. Mọi ngôn ngữ đều được hỗ trợ. Một ý tưởng tốt.

Còn không gian lưu trữ thì sao? VARCHAR nói chung là hiệu quả, vì bộ ký tự / mã hóa được thiết kế tùy chỉnh cho một miền địa phương cụ thể. Các trường NVARCHAR lưu trữ ở dạng mã hóa UTF-8 hoặc UTF-16, dựa trên cài đặt NLS đủ trớ trêu. UTF-8 rất hiệu quả đối với các ngôn ngữ "phương Tây", trong khi vẫn hỗ trợ các ngôn ngữ châu Á. UTF-16 rất hiệu quả đối với các ngôn ngữ châu Á, trong khi vẫn hỗ trợ các ngôn ngữ "phương Tây". Nếu lo ngại về không gian lưu trữ, hãy chọn cài đặt NLS để khiến Oracle sử dụng UTF-8 hoặc UTF-16 khi thích hợp.

Còn tốc độ xử lý thì sao? Hầu hết các nền tảng mã hóa mới sử dụng Unicode nguyên bản (Java, .NET, thậm chí C ++ std :: w chuỗi từ nhiều năm trước!) Vì vậy, nếu trường cơ sở dữ liệu là VARCHAR, nó buộc Oracle phải chuyển đổi giữa các bộ ký tự trên mỗi lần đọc hoặc ghi, không tốt lắm. Sử dụng NVARCHAR tránh chuyển đổi.

Tóm lại: Sử dụng NVARCHAR! Nó tránh các hạn chế và phụ thuộc, tốt cho không gian lưu trữ và thường tốt nhất cho hiệu suất.


42
Đây là một câu trả lời thực sự tốt, ngoại trừ câu hỏi là về máy chủ sql.
stimms

21

nvarchar lưu trữ dữ liệu dưới dạng Unicode, vì vậy, nếu bạn sẽ lưu trữ dữ liệu đa ngôn ngữ (nhiều ngôn ngữ) trong một cột dữ liệu, bạn cần có biến thể N.


16

Theo quan điểm của tôi

  1. Các chỉ mục có thể thất bại khi không sử dụng các kiểu dữ liệu chính xác:
    Trong SQL Server: Khi bạn có một chỉ mục trên cột VARCHAR và đưa ra chuỗi Unicode, SQL Server không sử dụng chỉ mục. Điều tương tự cũng xảy ra khi bạn trình bày một BigInt cho một cột được lập chỉ mục có chứa SmallInt. Ngay cả khi BigInt đủ nhỏ để trở thành SmallInt, SQL Server vẫn không thể sử dụng chỉ mục. Theo cách khác, bạn không gặp phải vấn đề này (khi cung cấp SmallInt hoặc Ansi-Code cho cột BigInt ot được lập chỉ mục).

  2. Các kiểu dữ liệu có thể khác nhau giữa các DBMS khác nhau (Hệ thống quản lý DataBase):
    Biết rằng mọi cơ sở dữ liệu có các kiểu dữ liệu hơi khác nhau và VARCHAR không có nghĩa là giống nhau ở mọi nơi. Trong khi SQL Server có VARCHAR và NVARCHAR, cơ sở dữ liệu Apache / Derby chỉ có VARCHAR và có VARCHAR ở dạng Unicode.


Nhưng chắc chắn nếu bạn viết mã của mình đúng cách (nghĩa là sử dụng các truy vấn được tham số hóa, v.v.) thì điểm 1 sẽ ít rủi ro hơn.
Paul

14

Chủ yếu là nvarchar lưu trữ các ký tự Unicode và varchar lưu trữ các ký tự không Unicode.

"Unicodes" có nghĩa là sơ đồ mã hóa ký tự 16 bit cho phép các ký tự từ nhiều ngôn ngữ khác như tiếng Ả Rập, tiếng Do Thái, tiếng Trung, tiếng Nhật, được mã hóa trong một bộ ký tự.

Điều đó có nghĩa là unicodes đang sử dụng 2 byte cho mỗi ký tự để lưu trữ và nonunicodes chỉ sử dụng một byte cho mỗi ký tự để lưu trữ. Điều đó có nghĩa là unicodes cần dung lượng gấp đôi để lưu trữ so với unicodes.


10

Bạn đúng. nvarcharlưu trữ dữ liệu Unicode trong khi varcharlưu trữ dữ liệu ký tự một byte. Khác với sự khác biệt về lưu trữ ( nvarcharyêu cầu gấp đôi dung lượng lưu trữ như varcharbạn đã đề cập, lý do chính để thích nvarcharhơn varcharlà quốc tế hóa (tức là lưu trữ chuỗi trong các ngôn ngữ khác).


10

Tôi sẽ nói, nó phụ thuộc.

Nếu bạn phát triển một ứng dụng máy tính để bàn, trong đó HĐH hoạt động bằng Unicode (giống như tất cả các hệ thống Windows hiện tại) và ngôn ngữ thực sự hỗ trợ Unicode (các chuỗi mặc định là Unicode, như trong Java hoặc C #), sau đó đi nvarchar.

Nếu bạn phát triển một ứng dụng web, trong đó các chuỗi có dạng UTF-8 và ngôn ngữ là PHP, vốn vẫn không hỗ trợ Unicode nguyên bản (trong phiên bản 5.x), thì varchar có thể sẽ là lựa chọn tốt hơn.


9

Mặc dù NVARCHARlưu trữ Unicode, bạn cũng nên xem xét bằng sự trợ giúp của đối chiếu, bạn cũng có thể sử dụng VARCHARvà lưu dữ liệu của ngôn ngữ địa phương của mình.

Chỉ cần tưởng tượng kịch bản sau đây.

Đối chiếu DB của bạn là tiếng Ba Tư và bạn lưu một giá trị như 'علی' (cách viết tiếng Ba Tư của Ali) trong VARCHAR(10) kiểu dữ liệu. Không có vấn đề gì và DBMS chỉ sử dụng ba byte để lưu trữ nó.

Tuy nhiên, nếu bạn muốn chuyển dữ liệu của mình sang cơ sở dữ liệu khác và xem kết quả chính xác, cơ sở dữ liệu đích của bạn phải có cùng đối chiếu với mục tiêu là tiếng Ba Tư trong ví dụ này.

Nếu đối chiếu mục tiêu của bạn khác nhau, bạn sẽ thấy một số dấu hỏi (?) Trong cơ sở dữ liệu đích.

Cuối cùng, hãy nhớ nếu bạn đang sử dụng một cơ sở dữ liệu khổng lồ để sử dụng ngôn ngữ địa phương của mình, tôi khuyên bạn nên sử dụng vị trí thay vì sử dụng quá nhiều khoảng trắng.

Tôi tin rằng thiết kế có thể khác nhau. Nó phụ thuộc vào môi trường bạn làm việc.


8

Tôi đã xem xét các câu trả lời và dường như nhiều người khuyên nên sử dụng nvarcharhơn varchar, bởi vì không gian không còn là vấn đề nữa, vì vậy không có hại trong việc bật Unicode để có thêm dung lượng lưu trữ nhỏ. Chà, điều này không phải lúc nào cũng đúng khi bạn muốn áp dụng một chỉ mục trên cột của mình. SQL Server có giới hạn 900 byte trên kích thước của trường bạn có thể lập chỉ mục. Vì vậy, nếu bạn có một varchar(900)bạn vẫn có thể lập chỉ mục, nhưng không varchar(901). Với nvarchar, số lượng ký tự được giảm một nửa, vì vậy bạn có thể lập chỉ mục tối đa nvarchar(450). Vì vậy, nếu bạn tự tin rằng bạn không cần nvarchar, tôi không khuyên bạn nên sử dụng nó.

Nói chung, trong cơ sở dữ liệu, tôi khuyên bạn nên tuân theo kích thước bạn cần, bởi vì bạn luôn có thể mở rộng. Ví dụ, một đồng nghiệp tại nơi làm việc từng nghĩ rằng không có hại trong việc sử dụng nvarchar(max)cho một cột, vì chúng tôi không có vấn đề gì với việc lưu trữ cả. Sau này, khi chúng tôi cố gắng áp dụng một chỉ mục trên cột này, SQL Server đã từ chối điều này. Tuy nhiên, nếu anh ấy bắt đầu với thậm chí varchar(5), chúng tôi có thể đơn giản mở rộng nó sau này thành những gì chúng tôi cần mà không có vấn đề như vậy sẽ yêu cầu chúng tôi thực hiện kế hoạch di chuyển trường để khắc phục vấn đề này.


7

nVarchar sẽ giúp bạn lưu trữ các ký tự Unicode. Đó là cách để đi nếu bạn muốn lưu trữ dữ liệu địa phương.


7

Nếu một byte đơn được sử dụng để lưu trữ một ký tự, có 256 kết hợp có thể và do đó bạn có thể lưu 256 ký tự khác nhau. Đối chiếu là mẫu xác định các ký tự và quy tắc mà chúng được so sánh và sắp xếp.

1252, là Latin1 (ANSI), là phổ biến nhất. Các bộ ký tự một byte cũng không đủ để lưu trữ tất cả các ký tự được sử dụng bởi nhiều ngôn ngữ. Ví dụ, một số ngôn ngữ châu Á có hàng ngàn ký tự, vì vậy chúng phải sử dụng hai byte cho mỗi ký tự.

Chuẩn Unicode

Khi các hệ thống sử dụng nhiều trang mã được sử dụng trong một mạng, việc quản lý giao tiếp trở nên khó khăn. Để chuẩn hóa mọi thứ, tập đoàn ISO và Unicode đã giới thiệu Unicode . Unicode sử dụng hai byte để lưu trữ mỗi ký tự. Đó là 65.536 ký tự khác nhau có thể được xác định, vì vậy hầu như tất cả các ký tự có thể được phủ bằng Unicode. Nếu hai máy tính sử dụng Unicode, mọi biểu tượng sẽ được biểu diễn theo cùng một cách và không cần chuyển đổi - đây là ý tưởng đằng sau Unicode.

SQL Server có hai loại kiểu dữ liệu ký tự:

  • không Unicode (char, varchar và văn bản)
  • Unicode (nchar, nvarchar và ntext)

Nếu chúng ta cần lưu dữ liệu ký tự từ nhiều quốc gia, hãy luôn sử dụng Unicode.


6

Tôi phải nói ở đây (tôi nhận ra rằng có lẽ tôi sẽ tự mở một ván trượt!), Nhưng chắc chắn là lần duy nhất khi NVARCHARthực sự hữu ích hơn (chú ý nhiều hơn ở đó!) Hơn VARCHARlà khi tất cả các va chạm trên tất cả của các hệ thống phụ thuộc và trong chính cơ sở dữ liệu có giống nhau không ...? Nếu không thì chuyển đổi đối chiếu phải xảy ra bằng mọi cách và do đó làm cho VARCHARkhả thi như NVARCHAR.

Để thêm vào điều này, một số hệ thống cơ sở dữ liệu, chẳng hạn như SQL Server (trước năm 2012) có kích thước trang xấp xỉ. 8K. Vì vậy, nếu bạn đang xem việc lưu trữ dữ liệu có thể tìm kiếm không được giữ trong một cái gì đó như một trường TEXThoặc NTEXTthì VARCHARcung cấp không gian đầy đủ 8k trong khi NVARCHARchỉ cung cấp 4k (gấp đôi byte, gấp đôi dung lượng).

Tôi cho rằng, để tóm tắt, việc sử dụng một trong hai phụ thuộc vào:

  • Dự án hoặc bối cảnh
  • Cơ sở hạ tầng
  • Hệ thống cơ sở dữ liệu

6

Theo sự khác biệt giữa Kiểu dữ liệu VARCHAR và NVARCHAR của Sql Server . Ở đây bạn có thể thấy một cách rất mô tả.

Nói chung, lưu trữ dữ liệu dưới dạng Unicode, vì vậy, nếu bạn sẽ lưu trữ dữ liệu đa ngôn ngữ (nhiều ngôn ngữ) trong một cột dữ liệu, bạn cần có biến thể N.


Đây là một liên kết rất hữu ích, nhưng câu trả lời của bạn không nhiều hơn thế: một liên kết.
RubberDuck

ckuhn203, tôi sẽ không nói với bạn để xem cái này
Pradeep Kesharwani

6

Sự khác biệt chính giữa Varchar(n)nvarchar(n)là: nhập mô tả hình ảnh ở đây

Varchar(Dữ liệu ký tự không phải là Unicode, có độ dài thay đổi) lên tới 8000. 1. Đây là loại dữ liệu có độ dài thay đổi

  1. Được sử dụng để lưu trữ các ký tự không Unicode

  2. Chiếm 1 byte không gian cho mỗi ký tự

nhập mô tả hình ảnh ở đây

Nvarchar: Dữ liệu ký tự Unicode có độ dài thay đổi.

1.Là kiểu dữ liệu có độ dài thay đổi

2.Sử dụng để lưu trữ các ký tự Unicode.

  1. Dữ liệu được lưu trữ trong một mã hóa Unicode. Mọi ngôn ngữ đều được hỗ trợ. (ví dụ: các ngôn ngữ Ả Rập, Đức, Hindi, v.v.)

6

Jeffrey L Whitledge với ~ 47000 điểm danh tiếng khuyên bạn nên sử dụng nvarchar

Solomon Rutzky với ~ 33200 điểm danh tiếng khuyến cáo: KHÔNG luôn luôn sử dụng NVARCHAR. Đó là một thái độ / cách tiếp cận rất nguy hiểm và thường tốn kém.

Sự khác biệt hiệu suất chính giữa các loại dữ liệu SQL Server varchar và nvarchar là gì?

https://www.sqlservercentral.com/articles/disk-is-cheap-orly-4

Cả hai người có uy tín cao như vậy, một nhà phát triển cơ sở dữ liệu máy chủ sql chọn gì?

Có nhiều cảnh báo trong câu trả lời và nhận xét về các vấn đề hiệu suất nếu bạn không nhất quán trong các lựa chọn.

Có ý kiến ​​pro / con nvarchar cho hiệu suất.

Có ý kiến ​​pro / con varchar cho hiệu suất.

Tôi có một yêu cầu cụ thể cho một bảng có nhiều hàng trăm cột, mà bản thân nó có lẽ là bất thường?

Tôi đang chọn varchar để tránh tiến gần đến giới hạn kích thước bản ghi bảng 8060 byte của máy chủ SQL * 2012.

Đối với tôi, việc sử dụng nvarchar vượt quá giới hạn 8060 byte này.

Tôi cũng nghĩ rằng tôi nên khớp các kiểu dữ liệu của các bảng mã liên quan với các kiểu dữ liệu của bảng trung tâm chính.

Tôi đã thấy việc sử dụng cột varchar tại nơi làm việc này, Chính phủ Nam Úc, bởi các nhà phát triển cơ sở dữ liệu có kinh nghiệm trước đây, trong đó số lượng hàng của bảng sẽ là vài triệu hoặc nhiều hơn (và rất ít cột nvarchar, nếu có, trong những rất lớn này bảng), vì vậy có lẽ khối lượng hàng dữ liệu dự kiến ​​sẽ trở thành một phần của quyết định này.


1

nvarcharan toàn để sử dụng so với varcharđể làm cho mã của chúng tôi không có lỗi (loại không khớp) vì cũng nvarcharcho phép các ký tự unicode. Khi chúng tôi sử dụng wheređiều kiện trong truy vấn SQL Server và nếu chúng tôi đang sử dụng =toán tử, nó sẽ gây ra lỗi một số lần. Lý do có thể cho điều này là cột ánh xạ của chúng tôi sẽ được thay đổi trong varchar. Nếu chúng tôi xác định nó trong nvarcharvấn đề này thì tôi đã không xảy ra. Tuy nhiên, chúng tôi vẫn tuân thủ varcharvà tránh vấn đề này, chúng tôi sử dụng LIKEtừ khóa tốt hơn là =.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.