Kiểu máy chủ SQL so với kiểu dữ liệu varchar [đã đóng]


287

Tôi có dữ liệu ký tự có độ dài thay đổi và muốn lưu trữ trong cơ sở dữ liệu SQL Server (2005). Tôi muốn tìm hiểu một số thực tiễn tốt nhất về cách chọn loại SQL SQL hoặc chọn loại SQL VARCHAR, ưu và nhược điểm về hiệu suất / dấu chân / chức năng.


17
Nếu Google gửi cho bạn ở đây: trang Kiểu dữ liệu SQL MSDN có thể giúp đỡ.
Jeroen

Câu trả lời:


212

Nếu bạn đang sử dụng SQL Server 2005 trở lên, hãy sử dụng varchar(MAX). Kiểu textdữ liệu không được dùng nữa và không nên được sử dụng cho công việc phát triển mới. Từ các tài liệu :

Quan trọng

ntext, textimagecác loại dữ liệu sẽ bị xóa trong phiên bản tương lai của Microsoft SQL Server. Tránh sử dụng các loại dữ liệu này trong công việc phát triển mới và lên kế hoạch sửa đổi các ứng dụng hiện đang sử dụng chúng. Sử dụng nvarchar (max) , varchar (max)varbinary (max) thay thế.


3
Cảm ơn Mladen, tôi ngạc nhiên khi thấy văn bản bị phản đối. Bạn có bất kỳ tài liệu chính thức đề cập đến điều này?
George2

1
Mặc dù đây không phải là "chính thức" nhưng nó bao gồm những điều cơ bản. Trên thực tế, văn bản không được dùng nữa và cũng không hỗ trợ tất cả mọi thứ mà varchar (max) làm, như khả năng tìm kiếm & lập chỉ mục. blog.sqlauthority.com/2007/05/26/...
achinda99

32
điều này thật vô lý như nó nhận được :) msdn.microsoft.com/en-us/l
Library / ms187993.aspx

1
Tuyệt vời achinda99 và Mladen Prajdic! Những gì bạn cung cấp là những gì tôi đang tìm kiếm. :-) Thêm một câu hỏi nữa, làm thế nào để chúng ta chọn sử dụng VARCHAR hay VARCHAR (MAX) trong các tình huống khác nhau?
George2

1
Thông tin chính thức về MS không được chấp nhận: msdn.microsoft.com/en-us/l
Library / ms187993% 28v = sql.90% 29.aspx

283

TEXTđược sử dụng cho các phần lớn dữ liệu chuỗi. Nếu độ dài của trường vượt quá một ngưỡng nhất định, văn bản sẽ được lưu ngoài hàng.

VARCHARluôn được lưu trữ theo hàng và có giới hạn 8000 ký tự. Nếu bạn cố gắng tạo một VARCHAR(x), trong đó x> 8000 , bạn sẽ gặp lỗi:

Máy chủ: Msg 131, Cấp 15, Bang 3, Dòng 1

Kích thước () được cung cấp cho loại 'varchar' vượt quá mức tối đa được phép cho bất kỳ loại dữ liệu nào (8000)

Những hạn chế chiều dài không quan tâm VARCHAR(MAX)trong SQL Server 2005 , có thể được lưu trữ ra khỏi hàng, giống như TEXT.

Lưu ý rằng đó MAXkhông phải là một loại hằng số ở đây, VARCHARVARCHAR(MAX)là những loại rất khác nhau, loại thứ hai rất gần với TEXT.

Trong các phiên bản trước của SQL Server, bạn không thể truy cập TEXTtrực tiếp, bạn chỉ có thể lấy TEXTPTRvà sử dụng nó trong READTEXTvà các WRITETEXTchức năng.

Trong SQL Server 2005, bạn có thể truy cập trực tiếp TEXTcác cột (mặc dù bạn vẫn cần truyền rõ ràng VARCHARđể gán giá trị cho chúng).

TEXT tốt:

  • Nếu bạn cần lưu trữ văn bản lớn trong cơ sở dữ liệu của bạn
  • Nếu bạn không tìm kiếm trên giá trị của cột
  • Nếu bạn chọn cột này hiếm khi và không tham gia vào nó.

VARCHAR tốt:

  • Nếu bạn lưu trữ chuỗi nhỏ
  • Nếu bạn tìm kiếm trên giá trị chuỗi
  • Nếu bạn luôn chọn nó hoặc sử dụng nó trong tham gia.

Bằng cách chọn ở đây tôi có nghĩa là đưa ra bất kỳ truy vấn nào trả về giá trị của cột.

Bằng cách tìm kiếm ở đây tôi có nghĩa là đưa ra bất kỳ truy vấn nào có kết quả phụ thuộc vào giá trị của cột TEXThoặc VARCHARcột. Điều này bao gồm sử dụng nó trong bất kỳ JOINhoặc WHEREđiều kiện.

TEXTđược lưu trữ ngoài hàng, các truy vấn không liên quan đến TEXTcột thường nhanh hơn.

Một số ví dụ về những gì TEXTtốt cho:

  • Blog bình luận
  • Trang Wiki
  • Mã nguồn

Một số ví dụ về những gì VARCHARtốt cho:

  • Tên người dùng
  • Tiêu đề trang
  • Tên tập tin

Theo nguyên tắc thông thường, nếu bạn cần giá trị văn bản vượt quá 200 ký tự không sử dụng nối trên cột này, hãy sử dụng TEXT.

Nếu không thì sử dụng VARCHAR.

PS Điều tương tự cũng áp dụng cho việc UNICODEkích hoạt NTEXTNVARCHARcũng vậy, mà bạn nên sử dụng cho các ví dụ ở trên.

PPS cũng áp dụng như VARCHAR(MAX)NVARCHAR(MAX)rằng SQL Server 2005 + sử dụng thay vì TEXTNTEXT. Bạn sẽ cần kích hoạt large value types out of rowchúng sp_tableoptionnếu bạn muốn chúng luôn được lưu trữ ngoài hàng.

Như đã đề cập ở trên và ở đây , TEXTsẽ bị phản đối trong các phiên bản tương lai:

Các text in rowtùy chọn sẽ được gỡ bỏ trong một phiên bản tương lai của SQL Server . Tránh sử dụng tùy chọn này trong công việc phát triển mới và lên kế hoạch sửa đổi các ứng dụng hiện đang sử dụng text in row. Chúng tôi khuyên bạn nên lưu trữ dữ liệu lớn bằng varchar(max), nvarchar(max)hoặc varbinary(max)kiểu dữ liệu. Để kiểm soát hành vi liên tiếp và ngoài hàng của các loại dữ liệu này, hãy sử dụng large value types out of rowtùy chọn.


2
1. "Nếu bạn không tìm kiếm giá trị của cột" - bạn có thể cho tôi biết "tìm kiếm" nghĩa là gì không? Bạn có nghĩa là chọn cột này, đặt hàng cột này, THÍCH cột này hoặc sử dụng một số chức năng thao tác chuỗi trên cột này?
George2

2
2. "VARCHAR luôn được lưu trữ theo hàng và có giới hạn 8000 ký tự." - xin lỗi tôi không đồng ý với bạn VARCHAR có thể dài hơn 8000 và nếu dài hơn 8000, VARCHAR sẽ được lưu trữ ngoài các cột. Có ý kiến ​​gì không?
George2

1
3. Mladen Prajdic được đề cập trong chủ đề này, loại văn bản không được chấp nhận, nhưng tôi không tìm thấy bất kỳ tài liệu nào đề cập đến vấn đề này. Bạn có bất kỳ tài liệu bao gồm điều này?
George2

2
Quassnoi tuyệt vời! Bạn thật là hiểu biết! :-) Thêm một câu hỏi nữa - "Tất nhiên điều này không liên quan đến VARCHAR (MAX), như đối với SQL SERVER 2005, một từ đồng nghĩa với văn bản." "Điều này" bạn có nghĩa là gì?
George2

"Tất nhiên điều này không liên quan đến VARCHAR (MAX), như đối với SQL SERVER 2005, một từ đồng nghĩa với văn bản." - bạn có tài liệu nào nói rằng văn bản giống như VARCHAR trong SQL Server 2005 không? Tôi đã thực hiện một số tìm kiếm nhưng không thể tìm thấy các tài liệu chính thức. :-)
George2

41

Trong máy chủ SQL 2005, các kiểu dữ liệu mới đã được giới thiệu: varchar(max)nvarchar(max) chúng có những ưu điểm của kiểu văn bản cũ: chúng có thể chứa tới 2GB dữ liệu, nhưng chúng cũng có hầu hết các ưu điểm của varcharnvarchar. Trong số những ưu điểm này là khả năng sử dụng các hàm thao tác chuỗi như chuỗi con ().

Ngoài ra, varchar (max) được lưu trữ trong không gian (đĩa / bộ nhớ) của bảng trong khi kích thước dưới 8Kb. Chỉ khi bạn đặt thêm dữ liệu vào trường, nó mới được lưu trữ ngoài không gian của bảng. Dữ liệu được lưu trữ trong không gian của bảng (thường) được truy xuất nhanh hơn.

Tóm lại, không bao giờ sử dụng Văn bản, vì có một cách thay thế tốt hơn: (n) varchar (max). Và chỉ sử dụng varchar (tối đa) khi một varchar thông thường không đủ lớn, tức là nếu bạn mong đợi chuỗi teh mà bạn sẽ lưu trữ sẽ vượt quá 8000 ký tự.

Như đã lưu ý, bạn có thể sử dụng SUBSTRING trên kiểu dữ liệu TEXT, nhưng chỉ khi các trường TEXT chứa ít hơn 8000 ký tự.


1
Cảm ơn Edoode, bạn đã trả lời khá đầy đủ về việc VARCHAR tốt như thế nào, nhưng có ý kiến ​​hay ý tưởng nào về việc khi nào nên sử dụng VARCHAR và khi nào nên sử dụng TEXT? Câu hỏi của tôi là về việc chọn 1 từ 2 vấn đề. :-)
George2

1
Trên thực tế, trong MS SQL Server 2005, bạn cũng có thể sử dụng SUBSTRING và các chức năng khác trên các cột TEXT.
Quassnoi

1
Cảm ơn Quassnoi! Hình như văn bản bị phản đối Thêm một câu hỏi nữa, làm thế nào để chúng ta chọn sử dụng VARCHAR hay VARCHAR (MAX) trong các tình huống khác nhau?
George2

1
Chỉ sử dụng varchar (tối đa) khi một varchar thông thường không đủ lớn (8Kb là đủ cho tất cả mọi người;)
edosoft

7

Đã có một số thay đổi lớn trong ms 2008 -> Có thể đáng xem xét bài viết sau khi đưa ra quyết định về loại dữ liệu sẽ sử dụng. http://msdn.microsoft.com/en-us/l Library / ms143432.aspx

Byte mỗi

  1. varchar (max), varbinary (max), xml, text hoặc cột hình ảnh 2 ^ 31-1 2 ^ 31-1
  2. cột nvarchar (tối đa) 2 ^ 30-1 2 ^ 30-1

3
Thay đổi? Những năng lực này không thay đổi kể từ khi các loại dữ liệu mới được giới thiệu.
Martin Smith
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.