2014-06-25 1 views
2

У меня есть таблица с обоими полями типа данных BLOB. Я использовал базу данных sqlite. Мне нужно вставить в таблицу только двоичный текст.LIKE работает над BLOB-типом, но = не работает

Я написал программу в C. Я вставил успешно.

я вставил в таблицу, используя подготовленный оператор

Когда я пытаюсь найти запись с помощью «=» это не работает. Но, как дает

INSERT INTO test1 VALUES('^A~T^F�u�(Z<-~K�~A3���H9�~\�~A[�$D~G%~^|�',"^Q'^K^S^H�~Iq�~Or~N)V��~K�");

QUERY заявления

SELECT COUNT(*) FROM invalid_cert WHERE issuerId='^A~T^F�u�(Z<-~K�~A3���H9�~\�~A[�$D~G%~^|�';

Это утверждение дает отсчет до 0

тогда

SELECT COUNT(*) FROM invalid_cert WHERE issuerId LIKE '^A~T^F�u�(Z<-~K�~A3���H9�~\�~A[�$D~G%~^|�';

Это утверждение возвращает правильный счетчик.

Почему это происходит? Я даже проверил длину строки в таблице и длину введенной строки. Обе длины одинаковы. Я даже проверил, есть ли в строке какие-либо «\ n» или «\ r». Нет такой строки.

+0

использование 'strlen' на'^A ~ T^Fu (Z <- ~ K ~ A3 H9 ~ \ ~ A [ $ D ~ G% ~^| ', а затем привязать blob к 'SELECT COUNT (*) FROM invalid_cert WHERE issuerId =?' , это должно сработать. (Вставка должна также использовать тип blob.) – cshu

ответ

0

Вы никогда не должны пытаться писать капли как строки. Помимо проблем с кодировкой, строки и капли не считаются равными.

(LIKE работает только со строками, так что сгустки автоматически преобразуется. Однако, если пятно на самом деле не является допустимой UTF-8 строки, преобразование может быть с потерями.)

Чтобы использовать двоичный объект в запросе вы можете либо используйте параметры:

SELECT COUNT(*) FROM invalid_cert WHERE issuerId = ? 

или blob literal:

SELECT COUNT(*) FROM invalid_cert WHERE issuerId = x'017E5406...' 
+0

Я пробовал использовать подготовленный отчет. Это не работает. Я попробую другой подход. –

+0

Второй подход бросает «непризнанный токен»: x'017E5406'' –

+0

Показать полный запрос. (И вы должны использовать фактическое значение своего блоба.) –

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