2009-11-09 55 views
7

Tôi đang bối rối như những gì câu lệnh SQL này có nghĩa là:Một "set + 0" trong câu lệnh SQL làm gì?

SELECT exhibitor_categories+0 from exhibitor_registry 

exhibitor_categories + 0 là gì? Nó trả về một số cho mỗi hàng được trả về.

exhibitor_categories được định nghĩa là:

set('contemporary', 'classical impression/transitional', 'outdoor', 'home accessories') 

Cảm ơn thời gian của bạn :)

+0

+1 Câu hỏi hay. Tôi tự hỏi liệu có tương đương với SQL Server 200/2005 không? Ví dụ: –

Trả lời

7

Nó implicity chuyển đổi giá trị thiết lập để một INTEGER.

Một tập hợp được coi là một bitmap, vì vậy các bộ giá trị đầu tiên cắn 0, các bộ giá trị thứ hai cắn 1, vv

mysql> CREATE TABLE exhibitor_registry(exhibitor_categories set('contemporary', 
'classical impression/transitional', 'outdoor', 'home accessories') NOT NULL); 

Query OK, 0 rows affected (0.08 sec) 

mysql> INSERT 
    -> INTO exhibitor_registry 
    -> VALUES ('contemporary,classical impression/transitional,outdoor'); 
Query OK, 1 row affected (0.03 sec) 

mysql> SELECT exhibitor_categories 
    -> FROM exhibitor_registry; 
+----------------------------------------------------------+ 
| exhibitor_categories          | 
+----------------------------------------------------------+ 
| contemporary,classical impression/transitional,outdoor | 
+----------------------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT exhibitor_categories + 0 
    -> FROM exhibitor_registry; 
+--------------------------+ 
| exhibitor_categories + 0 | 
+--------------------------+ 
|      7 | 
+--------------------------+ 
1 row in set (0.00 sec) 
+0

, giá trị như "hiện đại" được chuyển đổi thành một số nguyên như thế nào? hoặc, vì nó là một bộ, "hiện đại, ngoài trời" được chuyển đổi thành một số nguyên như thế nào? bạn có thông tin chi tiết nào về mục đích chuyển đổi giá trị đã đặt thành số nguyên không? – Obay

+0

wow! rất hữu ích! nó đã trở thành 7 như thế nào? nó sẽ không được 6 vì 1 + 2 + 3 = 6? – Obay

+1

'@ Obay': một bitmap thêm quyền hạn của hai để chúng không bị lẫn lộn. Đó là '2^0' + 2^1 +' 2^2 = 1 + 2 + 4 = 7'. Với '6', bạn sẽ không thể phân biệt giữa, ví dụ:' 1 + 2 + 3' và '2 + 4'. – Quassnoi

4

Check-out http://dev.mysql.com/doc/refman/5.0/en/set.html cho đầy đủ gầy, nhưng cơ bản là một lĩnh vực như vậy là được gọi là 'bộ' - nó có một danh sách các giá trị có thể, mà chỉ có thể là một hoặc nhiều giá trị. Giá trị được lưu trữ dưới dạng số ... có nghĩa là exhibitor_categories thực sự lưu trữ giá trị 4 khi ai đó đặt giá trị thành 'ngoài trời', bởi vì nó đặt bit thứ ba - '0100'. Khi bạn nhận được giá trị trở lại trong cơ sở dữ liệu sau đó, mysql sẽ tự động chuyển '0100' trở lại thành 'ngoài trời' cho bạn.

Nhưng, bằng cách thêm +0 vào truy vấn, bạn buộc kết quả ở lại một số, vì vậy bạn sẽ thực sự nhận được giá trị số '0100' nếu giá trị của hàng được đặt thành 'ngoài trời' trong trường hợp này.

Xin lỗi vì đã nhận được enum và thiết lập hỗn hợp.

Tại sao, bạn có thể hỏi, liệu nó có đặt giá trị thành '0100' thay vì chỉ nói '3', chẳng hạn như trong enum không? Bởi vì một tập hợp có thể chứa nhiều giá trị - nếu các giá trị 'hiện đại' (0001) và 'ngoài trời' (0100) được chọn, nó sẽ lưu trữ '0101' < - đặt bit thứ nhất và thứ 3, sẽ được trả về là '5' nếu bạn sử dụng mã +0.

+1

Đây là một 'tập' (bitmap), không phải là' enum'. Lưu trữ 'ngoài trời' sẽ đặt giá trị bằng số thành' 4'. – Quassnoi

+0

Quassnoi, tại sao 4? Nó sẽ không được 3 vì nó là yếu tố thứ ba được khai báo? – Obay

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