Có phải nó chỉ nvarchar
hỗ 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
?
Có phải nó chỉ nvarchar
hỗ 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
?
Câu trả lời:
Một nvarchar
cột có thể lưu trữ bất kỳ dữ liệu Unicode. Một varchar
cột được giới hạn trong một bảng 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 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 nvarchar
chứ 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 đủ.
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).
float
thành int
và đi, "cũng chắc chắn rằng các số thập phân đi mất tích." Chỉ không.
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.
"never"
, ít nhất là về mặt kỹ thuật.
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.
Theo quan điểm của tôi
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).
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.
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.
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 sự khác biệt về lưu trữ ( nvarchar
yêu cầu gấp đôi dung lượng lưu trữ như varchar
bạn đã đề cập, lý do chính để thích nvarchar
hơn varchar
là quốc tế hóa (tức là lưu trữ chuỗi trong các ngôn ngữ khác).
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.
Mặc dù NVARCHAR
lư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 VARCHAR
và 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.
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 nvarchar
hơ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.
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ự.
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ự:
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.
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 NVARCHAR
thực sự hữu ích hơn (chú ý nhiều hơn ở đó!) Hơn VARCHAR
là 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 VARCHAR
khả 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 TEXT
hoặc NTEXT
thì VARCHAR
cung cấp không gian đầy đủ 8k trong khi NVARCHAR
chỉ 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:
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.
Sự khác biệt chính giữa Varchar(n)
và nvarchar(n)
là:
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
Được sử dụng để lưu trữ các ký tự không Unicode
Chiếm 1 byte không gian cho mỗi ký tự
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.
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.
nvarchar
an 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 nvarchar
cho 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 nvarchar
vấn đề này thì tôi đã không xảy ra. Tuy nhiên, chúng tôi vẫn tuân thủ varchar
và tránh vấn đề này, chúng tôi sử dụng LIKE
từ khóa tốt hơn là =
.