Tại sao các hàm chuỗi trên máy chủ cơ sở dữ liệu dựa trên SQL bắt đầu ở vị trí 1 thay vì 0? [đóng cửa]


7

Điều này đã luôn làm phiền tôi. Có vẻ như các hàm chuỗi trong các máy chủ dựa trên SQL luôn bắt đầu ở vị trí 1 (ít nhất đây là trường hợp của MySQL, SQL Server, Oracle và Postgres). Ví dụ: truy vấn sau đây sẽ được sử dụng để chọn chữ cái đầu tiên của cột được gọi là First_name trong cơ sở dữ liệu tên:

SELECT SUBSTRING(first_name,1,1) FROM names;

Tại sao vị trí cho các hàm chuỗi không bắt đầu từ 0 như là tiêu chuẩn trong gần như mọi ngôn ngữ lập trình?

Tôi đang tìm kiếm nhiều hơn chỉ là tiêu chuẩn ANSI. Tại sao là tiêu chuẩn?

EDIT: Được rồi, vì vậy 0 không phải là "chuẩn mực trong gần như mọi ngôn ngữ lập trình" như đã được chỉ ra dưới đây. 1 cũng được sử dụng.


1
Tôi thấy lập chỉ mục dựa trên không rất kỳ lạ. Sau tất cả, đây là cách tôi tính trong cuộc sống thực. Một từ bắt đầu bằng ký tự đầu tiên, không phải ký tự "zeroed".
a_horse_with_no_name

Câu trả lời:


8

Xem xét rằng không có vị trí zeroeth trong một chuỗi bên ngoài máy tính, không nên đặt câu hỏi thực sự là: tại sao các chuỗi dựa trên 0 trong một số ngôn ngữ lập trình phổ biến hơn? (Tôi không chắc chắn về tuyên bố "gần như mọi ngôn ngữ lập trình" vì có nhiều ngôn ngữ hơn hầu hết mọi người biết đến)

Các chuỗi trong C và các ngôn ngữ khác chỉ đơn giản là một mảng các ký tự (nghĩa là char[]) bị nullhủy bỏ. Đây là lý do tại sao bạn có thể tham chiếu các ký tự riêng lẻ bằng cách sử dụng ký hiệu chỉ mục (nghĩa là stringVariable[index]). Các biến là một địa chỉ đến một vị trí trong bộ nhớ. Chỉ số là phần bù cho địa chỉ bắt đầu của mảng. Vì vậy, khi suy nghĩ về các chuỗi là một mảng, sẽ đủ ý nghĩa để tương tác với chúng theo kiểu 0 vì nó ít nhất là nhất quán ngay cả khi đôi khi hơi khó xử.

Tại sao điều này khác nhau trong SQL? Tôi đoán rằng nó phải làm với SQL là về lưu trữ vật lý nhiều hơn là cấp phát bộ nhớ. Mặc dù một số RDBMS thực hiện các mảng hỗ trợ (như PostgreSQL), nhưng điều đó không chuẩn. SQL cũng là một ngôn ngữ khai báo cấp cao, ẩn các chi tiết hoạt động của những gì công cụ truy vấn đang thực sự làm, và vì vậy các khái niệm về địa chỉ và con trỏ chỉ là không có. Do đó, thực sự không có ý nghĩa gì khi nghĩ về các chỉ mục dựa trên 0 khi làm việc với SQL.

Như một poster khác lưu ý, nguồn lập chỉ mục dựa trên zero là địa chỉ. Địa chỉ đầu tiên trong bất kỳ khối dữ liệu nào kết thúc bằng 0 (cho dù nó chiếm chữ số cuối cùng trong bộ nhớ vật lý hay không). Và đó không chỉ là máy tính - địa chỉ của ngôi nhà đầu tiên trong khu phố của bạn có khả năng là một số như 300 - chứ không phải 301.

Khi lập trình các hàm lặp trong đó các mô đun được sử dụng (để thực hiện điều gì đó cứ sau 5 lần lặp, v.v.) thì thật tiện lợi - và nhanh hơn - để làm việc với các mảng dựa trên zero.

Xin vui lòng xem:


1
Cảm ơn srutzky. Tôi nghĩ, dựa trên các ngôn ngữ mà tôi quen thuộc (không phải là "gần như mọi ngôn ngữ lập trình"), tôi đã giả sử, không chính xác, 0 là chuẩn mực. Tôi chưa bao giờ thực sự đặt câu hỏi đó ... nhưng bạn nói đúng. Tại sao một số ngôn ngữ bắt đầu từ 0 là một câu hỏi công bằng? ... Và quan điểm về mảng có ý nghĩa. Theo nhiều cách 1 là trực quan hơn.
VKK

Vô nghĩa, nếu phần lớn các ngôn ngữ lập trình đã chấp nhận 0 là khởi đầu của các chỉ mục, thì SQL hoàn toàn không có quyền loại bỏ quy ước này ra khỏi cửa sổ.
metabuddy

@metabuddy Tất nhiên SQL, và bất kỳ ngôn ngữ nào khác, có quyền tiếp cận mọi thứ theo bất kỳ cách nào có vẻ tốt nhất cho thế giới quan cụ thể đó. Có rất nhiều ngôn ngữ lập trình, với rất nhiều biến thể giữa chúng về cú pháp, phạm vi biến đổi, v.v. Có lẽ đó là một lựa chọn kém mà bất kỳ ngôn ngữ nào giải quyết trên các chỉ số dựa trên 0 ở vị trí đầu tiên (nó không trực quan lắm) .
Solomon Rutzky
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.