Câu hỏi Sự khác biệt giữa varchar và nvarchar là gì?


Có phải chỉ là nvarchar hỗ trợ các ký tự nhiều byte? Nếu đúng như vậy, có thực sự là bất kỳ điểm nào, ngoại trừ những lo ngại về lưu trữ, để sử dụng varchars?


1169
2017-09-27 19:34


gốc


Tôi thích điểm của incomudro, đó là những gì đã dẫn tôi để đào xung quanh 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 một SQL Server db sử dụng myBatis, mà dường như gửi các chuỗi như nvarchar theo mặc định (vẫn không chắc chắn cách (hoặc nếu) đó là overrideable). Một truy vấn đơn giản được hiển thị như là một vấn đề hiệu năng lớn bởi vì tôi đã định nghĩa cột mà nó đã chọn chống lại như là varchar, không phải nvarchar, và nó đã bỏ qua chỉ mục trên cột. - Sean Read
Liên kết này có thể giúp bạn codefari.com/2015/10/… - Singh


Các câu trả lời:


An nvarchar cột có thể lưu trữ bất kỳ dữ liệu Unicode nào. A varchar được giới hạn trong một mã 8 bit. Một số người nghĩ rằng varchar nê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 đúng. Codepage incompatabilities là một nỗi đau, và Unicode là cách khắc phục các vấn đề về mã. 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 xung quanh với 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 nvarchar thay vì varchar, bạn có thể tránh thực hiện chuyển đổi mã hóa mỗi lần 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 tầm thường.

Nếu bạn đang giao tiếp với một ứng dụng chỉ sử dụng ASCII, tôi vẫn khuyên bạn sử dụng Unicode trong cơ sở dữ liệu. Thuật toán collation hệ điều hành và cơ sở dữ liệu 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 khác hệ thống. 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 bộ nhớ Unicode đầy đủ.


1437
2017-09-29 02:16



Đây là thông tin tuyệt vời để có. Vì vậy, tôi hiểu điều này một cách chính xác nếu tôi suy ra rằng sự lựa chọn cuối cùng sẽ trở thành một trong những tài nguyên nào rẻ hơn: xử lý + phát triển trên không hoặc lưu trữ? - Matt Cashatt
@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 vinh quang, trong đó tất cả các dữ liệu văn bản trong Unicode và các nhà phát triển không bao giờ phải suy nghĩ về mã hóa thứ gì đó, và toàn bộ 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 thực sự không có sự lựa chọn nào cả. - Jeffrey L Whitledge
varchar không bị giới hạn ở một trang mã 8 bit trong tất cả các collations - Martin Smith
@ Martin Smith - Trong những trường hợp đó, lợi thế nhỏ bé mà varchar confers (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
@PeterAllenWebb - Bạn có thể "lưu trữ" 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 một cách minh bạch để lưu trữ và truy xuất dữ liệu. Bây giờ, những gì bạn không thể làm là chuyển đổi trường hợp đáng tin cậy và so sánh 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ó rất nhiều văn bản Desseret mà bạn muốn xử lý trên, nó sẽ là tốt nhất để làm điều đó bên ngoài cơ sở dữ liệu. Nhưng nó là tốt để lưu trữ nó ở đó. (Tất nhiên, varchar sẽ không giúp bạn ở đó đâu!) - Jeffrey L Whitledge


varchar: Dữ liệu ký tự không phải Unicode, độ dài thay đổi. Cơ sở dữ liệu collation xác định trang mã 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 collation 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 khớp với dữ liệu đầu vào của bạn (ASCII v. Unicode).


225
2017-09-27 19:37



Có một hạn chế như varchar không thể lưu trữ dữ liệu Unicode? Tất cả số 1 và số 0. Tôi có thể lưu nội dung Trung Quốc như 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
Cuối cùng câu trả lời: tất nhiên bạn có thể lưu trữ UTF-8 trong varchar nhưng nó sẽ phá vỡ các chức năng chuỗi SQL Server. Nếu bạn thực hiện tất cả các tìm kiếm / biến đổi trong ứng dụng của bạn 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 những gì về chỉ số? Nếu bạn muốn lưu trữ dữ liệu tùy ý, bạn nên sử dụng nhị phân thay thế. - Adriano Repetti
Có nó chỉ phá vỡ các chức năng tìm kiếm chuỗi. - Nishant
Vì vậy, bạn biết ... nó không "làm việc". Điều đó giống như lưu trữ một float vào một int và đi, "chắc chắn rằng các số thập phân bị mất tích." Chỉ cần không. - user7116


Tôi luôn luôn sử dụng nvarchar vì nó cho phép bất cứ điều gì tôi đang xây dựng để 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 Trung Quốc do tai nạn, bởi vì tôi đã sử dụng nvarchar. Những ngày này, bất kỳ ứng dụng mới nào cũng không thực sự quan tâm đến lượng không gian cần thiết.


61
2017-09-27 19:37



Ý 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 có phần hơi bị nhìn thấy, và bất kỳ ai đã xử lý các cơ sở dữ liệu ở mức doanh nghiệp 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
Để tự do đưa từ vào miệng của thẻ2k, tôi nghĩ rằng một tuyên bố chính xác hơn có thể là 'ngày càng không có bất kỳ ứng dụng mới nào quan tâm hơn đến không gian cần thiết hơn là quốc tế hóa và các vấn đề khác.' - Cowan
Cảm ơn Cowan, đó là ý tôi ... hơn 2 năm trước. Holy smokes! - tags2k
"Những ngày này, bất kỳ ứng dụng mới nào cũng không thực sự quan tâm đến lượng dung lượng cần thiết". - Trừ khi bạn đang sử dụng dung lượng lưu trữ đám mây miễn phí, trong đó gói trả phí là một bước nhảy đáng kể trong $ (xem các gói được chia sẻ của AppHarbor SQL Server). - ganders
@ ganders Howl! Bạn đang ở đó. Báo cáo tổng quát chỉ bao giờ được sửa chữa tạm thời ở mức tốt nhất. Máy tính chắc chắn là một trò chơi đu quay và xoay vòng. Tôi chắc chắn quan tâm đến bao nhiêu không gian tôi đang sử dụng trên Windows Azure ĐCSTQ. Điều đó nói rằng tôi sẽ "không bao giờ" sử dụng varchar trên nvarchar. Ooo đã làm tôi chỉ mâu thuẫn với bản thân mình? - rism


Ở đây bạn có thể thấy sự khác biệt giữa varchar và nvarchar.

Enter image description here

Enter image description here

Enter image description here

Enter image description here

Tài liệu tham khảo: SqlHints.com

Để biết thêm thông tin về Nvarchar và varchar, hãy xem bài đăng trên blog này.


42
2017-11-24 08:45



Vui lòng đăng văn bản thực tế thay vì ảnh chụp màn hình. Những người khác không thể sao chép và dán từ hoặc tìm kiếm trong hình ảnh của bạn. Xem ở đây để biết chi tiết. Cảm ơn bạn. - Pang
họ cũng không thể nhìn thấy hình ảnh từ bên trong một số bức tường lửa! - Allan Bowe


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ó bằng 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, tuyệt vời. Sử dụng VARCHAR và NVARCHAR khá giống nhau. Ngừng đọc ngay bây giờ, chỉ cần đi cho nó. Nếu không, hoặc nếu bạn không kiểm soát được 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 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 các chữ cái có dấu và vài ký tự khác (như € và -). Ứng dụng của bạn sẽ chỉ hữu ích cho một vài miền đị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 một bảng mã Unicode. Mọi ngôn ngữ đều được hỗ trợ. Một ý tưởng hay.

Điều gì về không gian lưu trữ? VARCHAR nói chung là hiệu quả vì bộ ký tự / mã hóa được thiết kế riêng cho một miền địa phương cụ thể. Các trường NVARCHAR lưu trữ trong mã hóa UTF-8 hoặc UTF-16, dựa trên cài đặt NLS một cách mỉa mai đủ. 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ả cho các ngôn ngữ Châu Á, trong khi vẫn hỗ trợ các ngôn ngữ "Phương Tây". Nếu quan tâm đến dung lượng lưu trữ, hãy chọn cài đặt NLS để làm cho Oracle sử dụng UTF-8 hoặc UTF-16 khi thích hợp.

Điều gì về tốc độ xử lý? Hầu hết các nền tảng mã hóa mới sử dụng Unicode nguyên gốc (Java, .NET, thậm chí C ++ std :: wstring 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 chuyển đổi giữa các bộ ký tự trên mọi đọ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 những hạn chế và phụ thuộc, là tốt cho không gian lưu trữ, và thường tốt nhất cho hiệu suất quá.


29
2017-10-07 18:08



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


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


15
2017-09-27 19:36





Hai xu 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ó chỉ mục trên cột VARCHAR và trình bày nó một 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 đến 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 không thể sử dụng chỉ mục. Cách khác xung quanh bạn không có vấn đề này (khi cung cấp SmallInt hoặc Ansi-Code cho cột BigInt ot NVARCHAR được lập chỉ mục).

  2. Các kiểu dữ liệu có thể khác nhau giữa các hệ quản trị DataBase khác nhau của DBMS:
    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à ở mọi nơi. Trong khi SQL Server có VARCHAR và NVARCHAR, một cơ sở dữ liệu Apache / Derby chỉ có VARCHAR và VARCHAR có trong Unicode.


13
2018-04-19 09:53



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


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

"Unicodes" có nghĩa là chương trình 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ự đơn.

Đ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 này có nghĩa là unicodes cần gấp đôi dung lượng để lưu trữ so với phi unicodes.


11
2017-12-14 12:09





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


9
2017-09-27 19:42





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, nơi hệ điều hành hoạt động trong Unicode (giống như tất cả các hệ thống Windows hiện tại) và ngôn ngữ không hỗ trợ Unicode (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 đến như là UTF-8, và ngôn ngữ là PHP, mà vẫn không hỗ trợ Unicode nguyên bản (trong phiên bản 5.x), thì varchar có lẽ sẽ là một lựa chọn tốt hơn.


8
2018-01-25 10:19