it-swarm-vi.tech

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

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
)
159
Guido

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), thì 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ữ 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ụ: ký tự không phải tiếng Anh.

Bằng cách xác định trường là 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ó 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.

255
David Sykes

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

20
Matthias Kestenholz

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

  1. Giới hạn trường đến 11 Nhân vật
  2. [.__.] 



16
user15453

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) .

3
Seldaek