Tengo una tabla en una base de datos SQLite que contiene alrededor de 15,000 escaneos de documentos de una sola página almacenados como cadenas base64. Si entiendo correctamente, convertirlos a binarios reduciría el tamaño de la tabla en un 25%.
¿Es correcto que no es posible convertir las imágenes a binarias en SQLite directamente, pero las cadenas base64 deben convertirse primero a imágenes y luego a binarias? Si es así, ¿será suficiente crear una imagen en Tcl a partir de cada cadena base64 y convertir a binario? ¿Y hay algún elemento complicado que un novato pueda pasar por alto al intentar hacerlo?
Cuando se ejecuta el código de prueba a continuación, parece que img_binary
son datos binarios, pero ¿es este el enfoque correcto?
Gracias.
set db "database_name"
sqlite3 dbws $db
#Base64 strings in database are prefixed with "data:image/gif;charset=utf-8;base64,"
set l [expr {[string length {data:image/gif;charset=utf-8;base64,}] -1}]
dbws eval { select img_base64 from lexi_raw where img_no = $nbr } {
image create photo ::img::lexi -data [string replace $img_base64 0 $l]
set img_binary [::img::lexi data -format png]; #Does this return binary to be written to SQLite?
puts $img_binary
}
SQLite no tiene un decodificador base64 incorporado, pero puede agregar uno.
Prueba esto:
package require sqlite3
sqlite3 db :memory:
db function base64decode -argcount 1 -deterministic -returntype blob {binary decode base64}
db eval {SELECT base64decode('SGVsbG8sIFdvcmxk') AS message}
El truco es el function
método, que crea una nueva función (llamada base64decode
) que es implementada por el fragmento de script Tcl dado ( binary decode base64
; el argumento se agrega como una palabra a eso). Estoy pasando -argcount 1
porque solo queremos pasar un solo argumento aquí, -deterministic
porque el resultado es siempre el mismo para la misma entrada y -returntype blob
porque sabemos que el resultado es binario.
Si desea realizar un procesamiento más complejo (como eliminar también un prefijo), es mejor implementarlo llamando a un procedimiento:
db function base64decode -argcount 1 -deterministic -returntype blob myDecoder
proc myDecoder value {
# Strip a leading prefix
regsub {^data:image/gif;charset=utf-8;base64,} $value "" value
# Decode the rest
return [binary decode base64 $value]
}
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras