2014-09-13 4 views
0

Существует странная ситуация в SQLite:Неожиданный результат битовая в SQLite

первое положение (нормальное) с Bitmask 0x04:

import sqlite3 

con = sqlite3.connect("~/test.db") 
cursor = con.cursor() 

cursor.execute("SELECT ((525824 & 04) == 04)") 
print 'Sqlite bitwise masking 04: ', cursor.fetchall()  #sqlite bitmask 
# Sqlite bitwise masking 04: [(0,)] // E.g. false 

print 'Python bitwise masking 04: ', 525824 & 0x04 == 0x04 #python bitmask 
# Python bitwise masking 04: False // E.g. false 

Одинаковые результаты в SQLite и Python. Это нормально.

второй ситуации (неожиданный) с Bitmask 0x00080000:

cursor.execute("SELECT ((525824 & 00080000) == 00080000)") 
print 'Sqlite bitwise masking 00080000: ', cursor.fetchall() 
# Sqlite bitwise masking 00080000: [(0,)] // E.g. False 

print 'Python bitwise masking 00080000: ', 525824 & 0x00080000 == 0x00080000 
# Python bitwise masking 00080000: True // E.g. True 

Почему результаты во 2-ом случае различны?

+0

Вы упускаете '0x' префикс в SQLite код. – Barmar

+0

cursor.execute ("SELECT (525824 & 0x00080000) == 0x00080000") не работает. Как я могу это исправить? – John

+0

Получил. Проще использовать 524288 = int ('0x00080000', 16) вместо hex. – John

ответ

1

Первый случай работает, потому что шестнадцатеричное 4 равно десятичной дроби 4. Но, во втором случае, шестнадцатеричное 0x80000 не равно десятичное 80000.

Смежные вопросы