2012-04-05 19 views
12

MySQL cung cấp toán tử đẹp <=> hoạt động với các so sánh có thể chứa một giá trị rỗng chẳng hạn như null <=> null hoặc null <=> 5 v.v. đưa ra kết quả trực quan bằng nhiều ngôn ngữ lập trình. Trong khi các nhà điều hành bình đẳng bằng luôn luôn chỉ trả về null, trong đó bắt nhiều người dùng MySQL mới như bản thân tôi đã quá lo lắng.Có lý do nào để không sử dụng <=> (toán tử bằng an toàn không) trong mysql thay vì =?

Có lý do gì khiến MySQL có cả hai chức năng này và không CHỈ là chức năng trong <=> không? Ai thực sự cần một nhà điều hành có hiệu quả không xác định với các loại ngôn ngữ được xây dựng?

Trả lời

6

Sự khác biệt lớn giữa null trong mySQL và các ngôn ngữ lập trình là trong mySQL, null nghĩa chưa biết giá trị trong khi lập trình nó có nghĩa không xác định giá trị.

Trong mySQL, null không bằng null (không xác định không bằng không xác định). Trong khi trong ngôn ngữ lập trình, null không bằng null (undefined equals undefined).

+3

Có, nhưng có lý do hợp lý cho điều này không? Vấn đề gì trong thế giới thực thực hiện điều này dễ dàng hơn? – Jonathon

2

Có lý do MySql có cả hai và không CHỈ là chức năng trong < => ? Các toán tử hoàn toàn khác nhau.

<=> thực hiện một so sánh bình đẳng như các nhà điều hành =, nhưng trả 1 hơn NULL nếu cả hai toán hạng là NULL, và 0 hơn NULL nếu một toán hạng là NULL.

Ai thực sự cần nhà điều hành có hiệu quả không xác định được với các loại ngôn ngữ được xây dựng ?

Điều này phụ thuộc vào trường hợp, chỉ vì bạn chưa gặp trường hợp như vậy, không có nghĩa là không ai cần đến nó.

+0

Có ai nghĩ về bất kỳ trường hợp nào không? Bởi vì tôi không thể nghĩ lại nơi tôi có thể sử dụng hành vi của = trên <=> trong hơn một thập kỷ phát triển chuyên nghiệp. – cellige

+0

Tôi có thể thấy việc sử dụng nếu được cung cấp một hành vi khác nhưng nó cung cấp hành vi NO khi được sử dụng với NULL vì kết quả luôn luôn là null miễn là có trong biểu thức .. – cellige

+2

@cellige Nó cung cấp không (hợp lý, hữu ích) hành vi khi được sử dụng với NULL bằng chữ. Nhưng khi so sánh hai biểu thức không phải chữ và vô giá trị, nó chắc chắn làm điều gì đó mà ai đó có thể hợp lý muốn nó. –

10

Ai thực sự cần nhà điều hành có hiệu quả không được xác định bằng các loại ngôn ngữ được xây dựng?

Bạn đã yêu cầu một số ví dụ thực tế. Đây là một giả mạo. Giả sử bạn có chương trình thanh thiếu niên trong khu dân cư hoặc tương tự và một trong những yêu cầu là trẻ em chỉ ở chung phòng với người cùng giới tính. Bạn có một trường M/F không có giá trị trong cơ sở dữ liệu của bạn - vô hiệu vì nguồn cấp dữ liệu của bạn chưa hoàn thành (bạn vẫn đang truy tìm một số dữ liệu). Mã phù hợp với phòng của bạn chắc chắn không phù hợp với sinh viên mà t1.Gender < => t2.Gender, bởi vì nó có thể kết thúc phù hợp với hai đứa trẻ giới tính không xác định, những người có thể là giới tính đối diện. Thay vào đó, bạn khớp với nơi chúng bằng nhau và không phải là cả hai.

Đó chỉ là một ví dụ. Tôi thừa nhận rằng hành vi của NULL và nhà điều hành = đã gây ra nhiều nhầm lẫn trong nhiều năm, nhưng cuối cùng lỗi có thể nằm với rất nhiều hướng dẫn trực tuyến về MySQL mà không đề cập đến cách NULL tương tác với các toán tử cũng như sự tồn tại của toán tử <=>.

+0

Ví dụ hay. Để diễn giải và có thể xây dựng. 'null' biểu thức có thể hữu ích khi các trường có một số hữu hạn các giá trị có thể, tuy nhiên cho phép các trường được undefined cho đến một điểm sau này trong thực thi của ứng dụng? – PdC

+0

Tôi sẽ tiến thêm một bước nữa - tôi không hiểu tại sao chúng chỉ hữu ích với một số giá trị hữu hạn (rõ ràng là tất cả các trường SQL có một số giá trị hữu hạn, nhưng tôi giả sử bạn có nghĩa là số hữu hạn _small_ !) Các giá trị Null hoạt động tốt trong tất cả các trường hợp mà các giá trị dữ liệu không được biết (cho dù chúng có thể được biết sau này) hay không. – almcnicoll

4

Ai thực sự cần nhà điều hành có hiệu quả không xác định được với các kiểu ngôn ngữ được xây dựng ?

bạn cũng cần nó cho các mối quan hệ bên trong cơ sở dữ liệu của bạn. đặc biệt nếu bạn đang sử dụng các ràng buộc khóa ngoại.

ví dụ: nếu bạn có bảng cho công việc (trong công ty của bạn). sau đó bạn chỉ định các nhiệm vụ này cho nhân viên. vì vậy bạn có một mối quan hệ từ bảng nhiệm vụ của bạn với bảng nhân viên của bạn.
và sẽ luôn có một số nhiệm vụ chưa được giao. trong trường hợp này, trường trong bảng nhiệm vụ mà bạn sử dụng cho mối quan hệ với bảng nhân viên sẽ chứa NULL. điều này sẽ đảm bảo rằng nhiệm vụ này chưa được gán. điều đó có nghĩa là: không có khả năng rằng có một mối quan hệ với bảng nhân viên.

nếu NULL = NULL sẽ là true, sau đó trong ví dụ của tôi sẽ luôn có khả năng khóa ngoài trong bảng nhân viên cũng là NULL. do đó nhiệm vụ sẽ được giao cho một hoặc một số nhân viên. và bạn sẽ không bao giờ có thể biết chắc chắn rằng một nhiệm vụ được giao cho một số nhân viên hay không.

1

Có.

Điều này phải là do cơ sở dữ liệu quan hệ sử dụng lý thuyết three-valued logic (TRUE, NULL, FALSE).

Và lôgic ba giá trị phải hoạt động như vậy vì nó phải nhất quán trong nội bộ.

Nó tuân theo các quy tắc của toán học.

Comparisons with NULL and the three-valued logic

+1

Đây là câu trả lời hay nhất theo ý kiến ​​của tôi. –

Các vấn đề liên quan