2009-08-13 56 views
11

Tôi đang lưu trữ tên và họ có tối đa 30 ký tự. Đó là tốt hơn varchar hoặc nvarchar.varchar hoặc nvarchar

Tôi đã đọc rằng nvarchar chiếm gấp đôi không gian so với varchar và rằng nvarchar được sử dụng để quốc tế hóa.

Vì vậy, bạn nên đề xuất điều gì: nvarchar hoặc varchar?

Cũng vui lòng cho tôi biết về hiệu suất của cả hai. Hiệu suất cho cả hai là giống nhau hoặc chúng khác nhau về hiệu suất. Bởi vì không gian không phải là vấn đề quá lớn. Vấn đề là hiệu suất.

+1

http://stackoverflow.com/questions/35366/varchar-vs-nvarchar-performance –

Trả lời

17

Về cơ bản, nvarchar có nghĩa là bạn có thể xử lý nhiều bảng chữ cái, không chỉ bằng tiếng Anh thông thường. Về mặt kỹ thuật, nó có nghĩa là hỗ trợ unicode, không chỉ ANSI. Điều này có nghĩa là các ký tự 2 byte hoặc khoảng hai lần không gian. Những ngày này không gian đĩa như vậy là giá rẻ bạn cũng có thể sử dụng nvarchar từ đầu chứ không phải đi qua nỗi đau của việc phải thay đổi trong cuộc đời của một sản phẩm.

Nếu bạn chắc chắn bạn sẽ chỉ cần hỗ trợ một ngôn ngữ mà bạn có thể gắn với varchar, nếu không tôi sẽ đi với nvarchar.

Điều này đã được thảo luận trên SO trước here.

CHỈNH SỬA: thay đổi ascii thành ANSI như đã lưu ý trong nhận xét.

+3

là nitpicky: thực tế, VARCHAR lưu trữ dữ liệu ANSI - 8-bit, thường dựa trên một trang mã như Tây Âu hoặc Iceland hoặc bất cứ điều gì bạn cần :-) Đó là ANSI - 8-bit - không phải ASCII (= 7-bit) –

6

Trước hết, để làm rõ, nvarchar lưu trữ dữ liệu unicode trong khi varchar lưu trữ dữ liệu ANSI (8 bit). Chúng hoạt động giống hệt nhau nhưng nvarchar chiếm gấp đôi không gian.

Nói chung, tôi thích lưu trữ tên người dùng bằng cách sử dụng varchar kiểu dữ liệu trừ khi những tên đó có các ký tự nằm ngoài ranh giới các ký tự mà varchar có thể lưu trữ.

Nó cũng phụ thuộc vào đối chiếu cơ sở dữ liệu. Ví dụ: bạn sẽ không thể lưu trữ các ký tự tiếng Nga trong trường varchar, nếu đối chiếu cơ sở dữ liệu của bạn là LATIN_CS_AS. Nhưng, nếu bạn đang làm việc trên một ứng dụng địa phương, mà sẽ được sử dụng chỉ ở Nga, bạn sẽ thiết lập cơ sở dữ liệu đối chiếu với Nga. Điều này sẽ làm là nó sẽ cho phép bạn nhập các ký tự tiếng Nga trong một lĩnh vực varchar, tiết kiệm một số không gian.

Tuy nhiên, hiện tại, hầu hết các ứng dụng đang được phát triển là quốc tế, vì vậy bạn phải tự quyết định xem tất cả người dùng sẽ đăng ký và dựa trên quyết định đó.

2

Tôi có màu đỏ mà nvarchar mất gấp đôi varchar.

Có.

nvarchar được sử dụng để quốc tế hóa.

Có.

những gì bạn nên sử dụng nvarchar hoặc varchar?

Tùy thuộc vào ứng dụng.

+1

Không chính xác. Một nvarchar cần gấp đôi không gian như là một varchar. Bạn có thể dễ dàng kiểm tra điều này bằng cách sử dụng hàm DATALENGTH. – Guffa

+0

Cảm ơn Kirtan. Tôi xin lỗi về sự bất tiện đã gây ra. – adatapost

1

Theo mặc định, hãy truy cập nvarchar. Có rất ít lý do để đi với varchar những ngày này, và mọi lý do để đi với nvarchar (cho phép các ký tự quốc tế; như đã thảo luận).

1

varchar là 1 byte cho mỗi ký tự, nvarchar là 2 byte cho mỗi ký tự.

Bạn sẽ sử dụng nhiều không gian hơn với nvarchar nhưng có nhiều ký tự được phép hơn. Không gian thêm là không đáng kể, nhưng bạn có thể bỏ lỡ những nhân vật phụ trong tương lai. Ngay cả khi bạn không mong muốn yêu cầu quốc tế hóa, mọi người thường sẽ có các ký tự không phải tiếng Anh (ví dụ: é, ñ hoặc ö) trong tên của họ.

Tôi khuyên bạn nên sử dụng nvarchar.

0

Loại nvarchar là Unicode, vì vậy nó có thể xử lý bất kỳ ký tự nào tồn tại trong mọi ngôn ngữ trên hành tinh. Các ký tự được lưu trữ dưới dạng UTF-16 hoặc UCS-2 (không chắc chắn, và sự khác biệt là tinh tế), vì vậy mỗi ký tự sử dụng hai byte.

Loại VARCHAR sử dụng bộ ký tự 8 bit, do đó, nó được giới hạn trong 255 ký tự của bộ ký tự mà bạn chọn cho trường. Có các bộ ký tự khác nhau xử lý các nhóm ký tự khác nhau, do đó, nó thường đủ cho văn bản cục bộ ở một quốc gia hoặc một vùng.

Nếu varchar hoạt động cho những gì bạn muốn làm, bạn nên sử dụng điều đó. Đó là một ít dữ liệu hơn, do đó, nó tổng thể nhanh hơn một chút. Nếu bạn cần xử lý nhiều ký tự, hãy sử dụng nvarchar.

1

tôi có màu đỏ nvarchar rằng phải mất gấp đôi varchar

Yes. Theo Microsoft: "Kích thước bộ nhớ, tính bằng byte, gấp hai lần số ký tự được nhập + 2 byte" (http://msdn.microsoft.com/en-us/library/ms186939(SQL.90).aspx).

Nhưng dung lượng lưu trữ rẻ; Tôi không bao giờ lo lắng về một vài byte phụ.

Ngoài ra, hãy tự khắc phục sự cố trong tương lai và đặt độ rộng tối đa cho độ rộng tối đa, chẳng hạn như 100 ký tự. Có hoàn toàn không có phí lưu trữ này khi bạn đang sử dụng varchar hoặc nvarchar (như trái ngược với char/nchar). Bạn không bao giờ biết khi nào bạn sẽ gặp phải họ ba nòng hoặc một số tên nước ngoài dài vượt quá 30 ký tự.

nvarchar được sử dụng để quốc tế hóa.

nvarchar có thể lưu trữ bất kỳ ký tự unicode nào, chẳng hạn như ký tự không phải chữ Latinh (tiếng Ả Rập, tiếng Trung, v.v.). Tôi không chắc chắn làm thế nào ứng dụng của bạn sẽ được lấy dữ liệu (thông qua web, thông qua một bộ công cụ GUI, vv) nhưng nó có khả năng rằng bất cứ công nghệ bạn đang sử dụng hỗ trợ unicode ra khỏi hộp. Điều đó có nghĩa là đối với bất kỳ dữ liệu nào do người dùng nhập (chẳng hạn như tên), có luôn là khả năng nhận các ký tự không phải Latinh, nếu không phải bây giờ thì trong tương lai.

Nếu tôi đang xây dựng một ứng dụng mới, tôi sẽ sử dụng nvarchar. Gọi nó là "tương lai chống" nếu bạn thích.

0

về hiệu suất:
lý do sử dụng varchar trên nvarchar là bạn có thể có gấp đôi số ký tự trong chỉ mục của mình! phím chỉ số được giới hạn ở 900 byte
về khả năng sử dụng:
nếu ứng dụng được duy nhất dành cho một khán giả tiếng Anh & chứa tên tiếng Anh, sử dụng varchar

+0

đã gặp phải một chỉ mục dài hơn 450 ký tự. – zszep

0

dữ liệu để lưu trữ: "Sunil"

varchar (5) mất 7B nvarchar (5) mất 12B

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