2013-10-28 3 views
1

내가 UNIX 권한과 같은 사용자 권한에 대한 SQL에 Bit bashing을 사용하고 때리기 비트 :MySQL과

1-001은 - 010 - - 100 -

4 쓰기

2 실행 - 읽기

그렇다면 6 (2 + 4 또는 110)의 권리가 있으면 쓸 수는 있지만 읽을 수는 있지만 실행할 수는 없습니다. 필자의 경우에는 더 많은 권한이 있으므로 사용자는 권리에 대해 128이라는 값을 가질 수 있습니다. 내가 쿼리를 할 수있는 모든 (UNIX 예 2와 같은) 권리

SELECT * from user WHERE user_right ?? '2' 

사용자 권한 2 (010)해야합니다, 3 (011), (6)와 함께 사용 물어 어떻게

(110) 또는 7 (111) σ!

내 영어 모두와 죄송합니다 감사합니다/

+0

[비트 연산자] (http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html) 알고 계십니까? 문서 하단에 좋은 예제가 있습니다 (user-contrib) –

+0

이 문서를 제공해 주셔서 감사합니다!나는 비트 연산자를 MYSQL에서 본 적이 없다. :) 좋은 쿼리 : SELECT * from user WHERE user_right & 2 – Arthur

+1

실제로 비트 조작을 활용하는 방법을 모른다면 비트 배싱과 같은 엉뚱한 용어를 던지기를 원하지 않을 수도있다. – Anthony

답변

0

(128)는 7 전체 사용자 권한이 있었다 의미 : MySQL은 이미 본질적으로 SET type로 알려진이에 대한 추상화를 가지고

1 1 1 1 1 1 1 = 0177 = 0x7F = 127 

오른쪽의 명명 된/보이는 값을 이진 값에 매핑합니다.

('Execute', 'Write', 'Read') 

그들은 실제로으로 서버 백엔드에 저장됩니다 : 그래서 만약 당신이 세트 열 user_right했다

이 같은 일반 쿼리 수
(1, 2, 4) 

:

SELECT * FROM user WHERE user_right LIKE '%Write%'; 

또는 사용 FIND_IN_SET :

SELECT * FROM user WHERE FIND_IN_SET('Write',user_right) > 0; 

또는 직접 비트 셋 작업 :

SELECT * from user WHERE user_right & 2; 

당신이 당신의 선택 쿼리에 ORDER BY user_right를 추가하는 경우, 그것은 그들의 수치 (안 알파벳) 순서로 반환하지만 그렇지 않으면 당신은 빨리와 사용자의 값을 확인할 수 있습니다

SELECT user_name, user_right FROM user; 

및 반환 된 값입니다보고 :

'some user' | Read,Write 

동안 여전히 매우 빠른 필터링을위한 비트 연산의 장점 갖는 : 읽기 모든 사용자를 반환하는

SELECT user_name, user_right FROM user WHERE user_right & ~1; 

및 실행 권한이없는 쓰기 권한.

+0

하나의 열에 둘 이상의 값을 저장하는 것은 1NF에 대한 것입니다. – Kermit

+0

SET는 OP가 수행하는 것과 마찬가지로 정의 된 옵션의 비트 세트를 저장합니다. 그래서 문제는 정규화를 위반하고 대답은 미리 정의 된 방법을 보여줍니다. 그렇지 않으면 당신은 그들이 어떻게 같은지 보지 못합니다. 즉, 당신이 실제로 이해하지 못하는 정규화 규칙을 내뿜고 있음을 의미합니다. 어느 쪽이든,이 솔루션은 mysql에 내장되어 있으며 OPs 수제 접근법보다 뛰어납니다. – Anthony

+0

XML ID에 도트가 포함될 수는 있지만 할 수 없다는 것을 모든 사람이 알고 있는지 확인한 후에 나중에 자식에게 불특정 키를 분할하지 않도록 지시해야합니다. – Anthony