BIT_OR и старший бит

sokol

Zavolga.Net
BIT_OR и старший бит

Вобщем непонятки у меня по поводу BIT_OR...
В мануале вроде как написано что он делает сложение с 64 битной точностью.

В полях хранится INT в котором иногда проставляется старший бит т.е. значение становится отрицательным, типа -2147483647
или 10000000000000000000000000000001 в бинарном представлении.

MySQL при запросе вида:
SELECT BIT_OR(filed) AS bitset FROM table GROUP_BY field2

выдает что bitset = 0, хотя явно видно что если в полях содержатся вышеприведенные значения, то быть того просто не может.

Я не пойму, даже если он отбрасывает старший бит расширяя до 64 битов, то все равно 0 никак не получается.

На положительных числах работает нормально.

-~{}~ 10.05.04 23:44:

Кстати
SELECT -2147483647 | -2147483647;
-> 0

это так и должно?

-~{}~ 10.05.04 23:45:

Как сделать чтобы побитовые операции производились только на 32 битах. Такое возможно?
 

Crazy

Developer
Код:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 3.23.52-nt

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SELECT -2147483647 | -2147483647;
+---------------------------+
| -2147483647 | -2147483647 |
+---------------------------+
|               -2147483647 |
+---------------------------+
1 row in set (0.03 sec)
 

si

Administrator
Код:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5982407 to server version: 4.0.17-standard

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SELECT -2147483647 | -2147483647;
+---------------------------+
| -2147483647 | -2147483647 |
+---------------------------+
|      18446744071562067969 |
+---------------------------+
1 row in set (0.00 sec)
-~{}~ 10.05.04 23:38:

Код:
mysql> create table test (a int, b int);   
Query OK, 0 rows affected (0.02 sec)

mysql> insert into test values(1,1), (1,2), (1,4), (2,1);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select bit_or(b) from test group by a;
+-----------+
| bit_or(b) |
+-----------+
|         7 |
|         1 |
+-----------+
2 rows in set (0.00 sec)
 

sokol

Zavolga.Net
si
Странно, в консольном клиенте я получил тот же результат что и ты.
В EMS MYSQL Manager 2.0 получил 0. Вобщем "Доверяй, но проверяй"

А про второй вопрос... т.е. результат полученный Crazy на MySQL 3.23.x получен на 32 битах, а на 4.x побитовые операции вычисляются на 64 битах, что сделать, чтобы он вычислялись как на 3.23.х?
 

tony2001

TeaM PHPClub
>В EMS MYSQL Manager 2.0 получил 0
потому, что сам EMS Manager не знает о 64-хбитных числах.
 

sokol

Zavolga.Net
si ну хотя бы для того чтбы делать быструю проверку на установленный старший бит, т.е. если отрицательное, значит проставлен.
 
Сверху