sqlite_udf_encode_binary
(PHP 5, PECL sqlite:1.0-1.0.3)
sqlite_udf_encode_binary — Кодирует бинарные данные, возвращаемые пользовательской функцией
Описание
sqlite_udf_encode_binary() кодирует бинарные данные data таким образом, что они могут быть возвращены в качестве результата запроса (так как библиотека libsqlite небезопасна для обработки бинарных данных).
Если данные могут быть бинарными (например, содежать NUL в середине строки или байт 0x01 в начале строки), то такие данные следует закодировать этой функцией перед тем, как возвращать их из пользовательской функции.
Кодирование не применяется к возвращаемым данным автоматически, так как это негативно сказывается на производительности. Применяйте эту функцию только там, где это действительно необходимо.
Замечание: Не используйте функцию sqlite_escape_string() для экранирования строк, возвращаемых из пользовательской функции, так ка это приведет к двойному экранированию. Используйте sqlite_udf_encode_binary() !
Смотрите также
sqlite_udf_decode_binary(), sqlite_escape_string(), sqlite_create_function() and sqlite_create_aggregate().
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения для работы с базами данных
- Расширения для работы с базами данных отдельных производителей
- SQLite
- sqlite_array_query
- sqlite_busy_timeout
- sqlite_changes
- sqlite_close
- sqlite_column
- sqlite_create_aggregate
- sqlite_create_function
- sqlite_current
- sqlite_error_string
- sqlite_escape_string
- sqlite_exec
- sqlite_factory
- sqlite_fetch_all
- sqlite_fetch_array
- sqlite_fetch_column_types
- sqlite_fetch_object
- sqlite_fetch_single
- sqlite_fetch_string
- sqlite_field_name
- sqlite_has_more
- sqlite_has_prev
- sqlite_key
- sqlite_last_error
- sqlite_last_insert_rowid
- sqlite_libencoding
- sqlite_libversion
- sqlite_next
- sqlite_num_fields
- sqlite_num_rows
- sqlite_open
- sqlite_popen
- sqlite_prev
- sqlite_query
- sqlite_rewind
- sqlite_seek
- sqlite_single_query
- sqlite_udf_decode_binary
- sqlite_udf_encode_binary
- sqlite_unbuffered_query
- sqlite_valid
Коментарии
I wrote a script to transfer my old data from a mysql database, performing some changes to a sqlite3 database. When I realized that that the sqlite interfaces is no longer included in PHP and my PECL didn't get it installed it was too late.
However, there is a very easy, though not particularly performant way to get the job done like in the "sqlite_encode_blob" function I present below. Note that this does ONLY encode the data. To actually use it in a query you will have to wrap it like: X'data' See the example below.
#!/usr/bin/php
<?php
function sqlite_encode_blob($data) {
$result = "";
for ($i = 0; $i < strlen($data); $i++) {
$result .= sprintf("%02X", ord(substr($data, $i, 1)));
}
return $result;
}
error_reporting(E_ALL);
$original = "62.jpg";
$data = file_get_contents($original);
$before = microtime(true);
$encodedData = sqlite_encode_blob($data);
$after = microtime(true);
unset($data);
echo "Encoding time needed: ".($after - $before)." seconds.\n";
$sql = <<<QUERY
BEGIN;
CREATE TABLE test(test BLOB);
INSERT INTO test(test) VALUES ( X'$encodedData' );
COMMIT;
QUERY;
unset($encodedData);
file_put_contents("test.sql", $sql);
`sqlite3 blob_test.db < test.sql`
?>
The tricky part is to get the data back out of the database - that is not possible with the command line tool as far as I can tell. You will have to use a language with an actual API.
The following example is written in C and compiles on a linux box where the sqlite3 API is installed using:
gcc -o test test.c `pkg-config --cflags --libs sqlite3`
Note that this has absolutely no error checking whatsoever. If the slightest thing goes wrong it will likely cause a segmentation fault and likely leave the database corrupted.
# FILE test.c START
#include <stdlib.h>
#include <stdio.h>
#include <sqlite3.h>
#define DB_FILE "blob_test.db"
#define QUERY_STRING "SELECT data FROM test"
#define STORAGE_FILE "test.jpg"
int main(int argc, char** argv) {
sqlite3 *db = NULL;
int size = 0;
const char *data = NULL;
sqlite3_stmt *query = NULL;
const char *rest = NULL;
FILE *file = NULL;
sqlite3_open(DB_FILE, &db);
sqlite3_prepare_v2(db, QUERY_STRING, sizeof(QUERY_STRING), &query, &rest);
sqlite3_step(query);
size = sqlite3_column_bytes(query, 0);
data = sqlite3_column_blob(query, 0);
file = fopen(STORAGE_FILE, "w");
fwrite(data, 1, size, file);
fclose(file);
sqlite3_finalize(query);
sqlite3_close(db);
return 0;
}
# FILE test.c END