2013-04-22 1 views
0

현재 프로젝트에서 데이터베이스에 bitfield 열을 구현하고 있습니다. 50 비트이지만 PHP에서 만든 비트 필드를 제대로 삽입하지 않는 것 같습니다. 이것은 리터럴 쿼리입니다 (PHP와 phpMyAdmin에서 모두 제출하려했습니다).MySQL 쿼리가 BIT (50) 비트 필드를 제대로 삽입하지 않는 이유

INSERT INTO features (title, category_id, bitnum) 
VALUES ("a6", "0", b'00000000000000000000000000100000000000000000000000') 

그러나 어떤 이유에 phpMyAdmin과 PHP 출력이되는 값 : 나는 그것을 출력하는 SELECT 쿼리에 BIN (bitnum)를 사용하여 bitnum 열을 선택하도록 선택하는 경우, 지금

00001100110011100000111000001101100011000000111000 

올바른 값. 그러나이 작업을 진행하기 전에 실제로이 작업을 수행하고 있는지 알 필요가 있습니다 (나중에 플래그와 비교하여 열을 확인해야하기 때문에). 중간에 단 하나의 1을 가지고있는 첫 번째 비트 필드가 0과 1의 이상한 엉망이되어 지금 당장 나에게 이해가 가지 않는 것은 당연한 것처럼 보입니다.

Google에서 주제에 대해 아무것도 찾지 못했습니다. BIT 열은 64 비트까지 지원합니다.

미리 감사드립니다.

답변

1

bitnum 열이 bit(50)으로 정의되어 있습니까?

내 생각 엔 값이 DB에 제대로 삽입됩니다. 그 이후에는 모든 테스트가 필요합니다.

"phpMyAdmin 및 PHP 출력이 다음과 같을 때 어떤 검색어를 사용합니까 : 00001100110011100000111000001101100011000000111000"?

PhpMyAdmin을 조금 사용해 보았지만 bit 열을 비어있는 것으로 표시합니다 (NULL). PhpMyAdmin의 SQL 쿼리 인터페이스를 사용해도 표시해야 할 값이 표시되지 않았습니다. 다른 DB 관리 소프트웨어를 사용해보십시오. Sequel Pro을 사용하고 DB에 입력 될 때 bit 값을 표시합니다. (어쩌면 PhpMyAdmin도 어쨌든 그것을 수행합니다. 단지 어떻게 알지 못합니다.)

PHP 엔진은 잘 ... my interesting question을 참조하십시오. 일부 PHP 버전에는 버그가있을 수 있습니다. 적어도 이와 비슷한 쿼리는 정확한 값을 검색해야합니다.

SELECT (bitnum + 0) AS my_multiple_bit FROM features 

그 질문의 my RTM moment이었다 If "+ 0" is not used the value of a bit(1) column is treated as binary string. (또한 PHP 버전가 자신의 문제를 일으킬 수 있다는 것을 기억하십시오.)

어쩌면 또한 BIN(bitnum) 작품 (bitnum + 0)으로합니다. 하나 더 많은 PHP 엔진 버전을 사용해보십시오. 모든 것이 제대로 작동하면 모든 것이 작동합니다. BTW

. bit(50) 열을 사용하는 데 특별한 이유가 있습니까? int 또는 char의 문제점은 무엇입니까? (난 그냥 그것의 킥 부울 true/falsebit(1)을 사용했다. tinyint(1)는 논리 값 FO 내 다른 대안이다. 나는 this whole article를 읽어 보지 않았하지만 어쩌면 bit 열이 MySQL의에서 열 유형을위한 최선의 선택이 아니다.)

+0

나는 비트 솔루션을 삭제하고 대신 int (실제로 bigint)를 사용하기로 결정했습니다. "+0"을 추가하면 MySQL이 올바르게 처리하도록 강제 할 것입니다.또한 공유 한 기사는 좋은 가치 인 것 같습니다. BIT는 분명히 최적의 방법이 아닙니다. 그리고 비트 AND는 숫자 값에 대해서도 잘 작동합니다. 그런 생각을하지 못했습니다. 그러나 완벽한 의미입니다. 시간 내 주셔서 감사합니다. –