Sự khác biệt giữa BYTE và CHAR trong kiểu dữ liệu cột


166

Trong Oracle, sự khác biệt giữa:

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 BYTE),
 ID_CLIENT NUMBER
)

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 CHAR), -- or even VARCHAR2(11)
 ID_CLIENT NUMBER
)

Câu trả lời:


265

Giả sử bộ ký tự cơ sở dữ liệu là UTF-8, đây là cài đặt được đề xuất trong các phiên bản gần đây của Oracle. Trong trường hợp này, một số ký tự mất hơn 1 byte để lưu trữ trong cơ sở dữ liệu.

Nếu bạn xác định trường là VARCHAR2(11 BYTE) , Oracle có thể sử dụng tối đa 11 byte để lưu trữ, nhưng thực tế bạn có thể không lưu trữ được 11 ký tự trong trường, vì một số trong số chúng mất nhiều hơn một byte để lưu trữ, ví dụ như các ký tự không phải tiếng Anh.

Bằng cách xác định trường khi VARCHAR2(11 CHAR)bạn nói với Oracle, nó có thể sử dụng đủ dung lượng để lưu trữ 11 ký tự, bất kể cần bao nhiêu byte để lưu trữ mỗi ký tự. Một ký tự đơn có thể yêu cầu tối đa 4 byte.


55
Lưu ý rằng ngữ nghĩa độ dài ký tự không ảnh hưởng đến độ dài tối đa 4000 byte cho a VARCHAR2. Khai báo a VARCHAR2(4000 CHAR)sẽ cho phép ít hơn 4000 ký tự nếu một số ký tự yêu cầu nhiều byte lưu trữ.
Hang Justin

@David Sykes Điều này có giống về mặt ngữ nghĩa với NVARCHAR (11) không?
Nap

@Nap Không xa như tôi biết. Tôi tin rằng tham số kích thước trong khai báo loại NVARCHAR có ý nghĩa như trong VARCHAR2. tức là để đảm bảo đủ dung lượng lưu trữ cho 11 ký tự (không phải byte) trong bộ ký tự NVARCHAR, bạn sẽ nói NVARCHAR (11 CHAR). LƯU Ý: Tôi chưa thực sự kiểm tra điều này. Tôi chưa bao giờ sử dụng NVARCHAR.
David Sykes

Để minh họa thêm cho sự khác biệt giữa hai: bốn ký tự của giá trị được mã hóa hex (tức là "0xFF") hoặc ba ký tự thập phân (tức là "255") có thể được "nén" khi được biểu thị dưới dạng một byte đơn: 11111111. Điều này có thể sau đó hữu ích cho các cờ bit (tối đa 8 cài đặt), hoạt động theo bit, v.v.
Matt Borja

Lưu ý rằng 1 dưới dạng ký tự ASCII (ngày 49 tháng 12) là 1001001 trong khi 1 dưới dạng bit là 00000001.
Matt Borja

21

Một cái có không gian chính xác cho 11 byte, cái còn lại cho chính xác 11 ký tự. Một số bộ ký tự như các biến thể Unicode có thể sử dụng nhiều hơn một byte cho mỗi char, do đó trường 11 byte có thể có không gian cho ít hơn 11 ký tự tùy thuộc vào mã hóa.

Xem thêm http://www.joelonsoftware.com/articles/Unicode.html


17

Tùy thuộc vào cấu hình hệ thống, kích thước của CHAR được đặt trong BYTES có thể khác nhau. Trong ví dụ của bạn:

  1. Giới hạn trường đến 11 BYTE
  2. Giới hạn lĩnh vực đến 11 CHAR acters


Kết luận: 1 CHAR không bằng 1 BYTE.


4

Tôi không chắc vì tôi không phải là người dùng Oracle, nhưng tôi cho rằng sự khác biệt nằm ở khi bạn sử dụng các bộ ký tự nhiều byte như Unicode (UTF-16/32). Trong trường hợp này, 11 Byte có thể chiếm ít hơn 11 ký tự.

Ngoài ra, các loại trường đó có thể được xử lý khác nhau liên quan đến các ký tự hoặc trường hợp có dấu, ví dụ 'binaryField (ete) = "été"' sẽ không khớp trong khi 'charField (ete) = "été"' có thể (một lần nữa không chắc chắn về Oracle) .

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.