У меня есть база данных, которая отправляет почти все данные в виде строковых/числовых значений. Одно поле оказалось двоичным. Когда я вижу двоичное значение $, мне нужно strtoupper (bin2hex ($ value)), чтобы он работал с остальной частью кода.
Я вижу, что PHP 6 будет иметь функцию is_binary. Сейчас я использую эту функцию, но я предполагаю, что будут непредвиденные недостатки. Пожалуйста, дайте мне знать, если вы видите вопиющую проблему.
function is_binary($value)
{
for($i=0;$i<strlen($value);$i++)
if(ord($value{$i})>128)
return true;
return false;
}
Логика заключается в том, что ни одно из значений буквенно-цифрового поля не будет иметь символ с ASCII-значением выше 128 и все двоичные значения будут.
Для получения дополнительной информации база данных - это Oracle, и тревожные данные выводятся из столбца с типом RAW.
Тип данных RAW
просто означает, что Oracle не будет выполнять преобразование набора символов или любое другое преобразование значения столбца при передаче его в приложение. Предполагается, что именно само приложение знает, какие данные хранятся в столбце и интерпретировать его соответствующим образом.
Чтобы определить тип данных столбца таблицы, вам нужно получить доступ к метаданным столбца, например, вызвав odbc_result()
.
Ваша логика определения того, является ли значение "двоичным" или нет, является ошибочной, как указывали другие. Например, значение, представленное 0x656667
может выглядеть как строка "ABC" для вас, но на самом деле это может быть целочисленное значение 6645351.
Я не думаю, что это сработает. Данные могут быть двоичными, но использовать укусы, которые ниже 128.
Кроме того, вы можете иметь строку UTF-8, например, которая имеет действительные кодовые точки выше 128, и это будет строка, а не двоичная.