Hiểu cột varchar (tối đa) 8000 và lý do tại sao tôi có thể lưu trữ hơn 8000 ký tự trong đó


13

Từ tài liệu Microsoft này , +

n xác định độ dài chuỗi và có thể là giá trị từ 1 đến 8.000. max chỉ ra rằng kích thước lưu trữ tối đa là 2 ^ 31-1 byte (2 GB). Kích thước lưu trữ là chiều dài thực tế của dữ liệu được nhập + 2 byte.

Xin hãy giúp tôi hiểu điều này.

Các ký tự tối đa cho varchar dường như là 8000, ít hơn 2GBgiá trị của dữ liệu.

Tôi thấy rằng có các bản ghi trong varchar(max)cột này của một bảng cụ thể có len(mycolumn)> 100 000. Vì vậy, tôi biết tôi có thể nhận được nhiều hơn các 8000ký tự vào một varchar(max)cột.

Câu hỏi 1: Làm thế nào để các 8000nhân vật vào chơi và tôi nên biết về nó ở đâu?

Câu hỏi 2 : một truy vấn dữ liệu .net vào cột này sẽ luôn trả về kết quả đầy đủ với hơn 100 000 ký tự?


Lưu ý rằng varchar(max)đã từng được gọi textvà được coi là một loại dữ liệu khác nhau.
Ông Lister

Có lẽ đọc cái này ? Nó liên quan đến kích thước trang 8K. Các giá trị quá lớn để vừa trong một trang (giới hạn thực sự lớn hơn 8000) được lưu vào các trang LOB_DATA (Đối tượng lớn).
Justin

Câu trả lời:


30

Tôi có thể thấy lý do tại sao bạn hiểu nhầm điều này - nó hơi khó. Tất cả đều hợp lệ:

  • VARCHAR (1) - một chuỗi ký tự
  • VARCHAR (4000) - 4.000 ký tự
  • VARCHAR (8000) - 8.000 ký tự - và nếu bạn sử dụng một số cho định nghĩa của trường này, đó là SỐ cao nhất bạn có thể sử dụng, nhưng hãy xem điều này:
  • VARCHAR (MAX) - cái đó chứa tối đa 2GB.

Và có, nếu bạn cố gắng lấy dữ liệu ra khỏi trường VARCHAR (MAX) và ai đó đã lưu trữ 2GB trong đó, hãy khóa lại.


3
and somebody stored 2GB in there, buckle up.- Đã ở đó với một vài tập tin blob
Ruslan

7

Câu hỏi 1: 8000 nhân vật xuất hiện như thế nào và tôi nên biết về nó ở đâu?

Đặt n thành 8000 khiến 8000 ký tự xuất hiện. Bạn cần lưu ý các tài liệu tham khảo Chính xác, Tỷ lệ và Độ dài (Transact-SQL) về char, nchar, nvarchar và varchar. Ngược lại, việc đặt n thành max (không có dấu ngoặc kép) khiến SQL Server lưu trữ (và trả về) số byte tối đa (như được đề cập trong trích dẫn của bạn).

Câu hỏi 2: một truy vấn dữ liệu .net vào cột này sẽ luôn trả về kết quả đầy đủ với hơn 100 000 ký tự?

Đây là một câu hỏi .Net (không phải SQL Server), nhưng bộ dữ liệu .Net tìm nạp một luồng byte. Một byte không phải là ký tự và SQL Server trả về byte (không phải ký tự). Nếu n được đặt thành 8000 và loại dữ liệu là nvarchar, SQL Server trả về tối đa 8000 byte, mà bộ dữ liệu .Net có thể hiểu là 4000 ký tự Unicode. Nếu n được đặt thành 8000 và loại dữ liệu là varchar, SQL Server trả về tối đa 8000 byte, mà bộ dữ liệu .Net có thể hiểu là tối đa 8000 ký tự ANSI. Nếu n được đặt thành tối đa và loại dữ liệu là nvarchar, SQL Server trả về tối đa 2 ^ 31-1 byte, mà bộ dữ liệu .Net có thể hiểu là tối đa (2 ^ 31-1) / 2 ký tự. Nếu n được đặt thành tối đa và loại dữ liệu là varchar, SQL Server trả về tối đa 2 ^ 31-1 byte, mà bộ dữ liệu .Net có thể hiểu là tối đa 2 ^ 31-1 ký tự ANSI.

Nếu bạn chọn sử dụng char hoặc varchar (thay vì nchar hoặc nvarchar) vì chúng có thể lưu trữ nhiều "ký tự" hơn (chính xác hơn: byte), bạn cần lưu ý rằng nhiều ký tự Unicode không có ký tự ANSI tương đương (do đó là một phần lớn của chúng tôi Người dùng trên thế giới sẽ không thể thấy các ký tự được bản địa hóa / bản địa của họ trong ứng dụng của bạn).

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.