menu

arrow_back Hvordan detektere at binære BLOB data er lagret i tekstfelt CLOB?

av
(423 poeng) 1 3 11
i Programvare
redigert av
184 visninger
0 stemmer

Hvordan kan uttrekksprodusent og videre depot detektere at binære verdier av data av type BLOB er blitt lagret i tekst CLOB-felter i en eller flere tabeller i databasen som skal bevares?

Eksempel at en binær fil som PDF er lagret i et tekstfelt (CLOB) som longtext i stedet for å bli lagret i et binært felt som longblob (BLOB)?

Problemet er at uttrekksprogrammet som lager SIARD-fil for uttrekke kan risikere å lagre binær fil gjennom et UTF-8 filter, slik at alle binære bytes med verdier 0-255, da blir filtrerte slik at UTF-8 ugyldige tegn av disse 256 tegn da får erstatningstegn i stedet for det korrekte byte. Dermed blir lagret fil korrumpert til en ubrukelig "tekstfil" i stedet for originalen som f. eks. var PDF binær fil.

Spørmål
- Er det enkelt å lage et analyseprogram som sjekker innhold i slike CLOB tekstfelter for ugyldige bytes?
- Hvilke andre strategier kan vi gå for?
- Ytfyllende teknisk beskrivelse av problemstiling er det fint hvis noen database-eksperter kan utfylle informasjon på?
- Hvordan kan binær verdi lagres i et tekstfelt i utgangspunktet?

1 svar

Akseptert svar
1 stemme
 
Akseptert svar

Som hovedregel, mener jeg at databasedesignere bør unngå å lagre binære data i tekstfelt som CLOB, ettersom dette kan føre til problemer som beskrevet i spørsmålet. Når binære data lagres i et tekstfelt, kan det føre til at dataene blir korrupt på grunn av filtre eller koding som ikke støtter binær data.
For å finne ut om binære data er lagret i CLOB-felter, kan man utføre en analyse av databasen. Dette kan gjøres ved å inspisere tabellene og felttypene som brukes til å lagre dataene. For eksempel kan man bruke SQL-spørringer for å finne alle tabellene som inneholder CLOB-felt og deretter inspisere dataene i disse feltene for ugyldige bytes.

Her er eksempelkode for MSSQL:
Disclaimer: Jeg har ikke en klient tilgjengelig og jeg er super-rusten på dette, så jeg kan ikke verifisere at koden er helt korrekt. Om noen med databasekunnskaper kan korrigere meg, så hadde det vært veldig fint.

SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE = 'text' OR DATA_TYPE = 'ntext'

Dette skal returnere en liste over tabellnavn, kolonnenavn og datatyper for alle tabeller som inneholder CLOB-felt. Du kan deretter inspisere dataene i disse feltene for ugyldige bytes ved hjelp av en annen spørring, for eksempel:

SELECT *
FROM [table_name]
WHERE PATINDEX('%[' + CHAR(0) + '-' + CHAR(31) + CHAR(127) + ']%', [column_name]) > 0

Denne spørringen vil returnere alle rader i tabellen [table_name] der kolonnen [column_name] inneholder ugyldige bytes. CHAR(0) til CHAR(31) og CHAR(127) representerer ASCII-tegn som ikke kan vises i vanlig tekst og som derfor kan indikere tilstedeværelse av ugyldige bytes.

Vi har i våre rutiner inkludert en instruks som sier at Uttrekksansvarlig hos Leverandør skal hente ut binære data fra databasene og erstatte disse med filreferanser til en mappe på utsiden. Både for å sikre mot problemene du nevner, men også for å gjøre database-filene (siard eller dmp f.eks.) lettere å jobbe med i depot.

av
(380 poeng) 1 2 13
akseptert av

Velkommen!

Søk etter svar, still spørsmål og bidra med kunnskap sammen med norges felleskap på felter som arkiv, konservering og formidling. Alle er velkomne som medlemmer! Her er terskelen for å spørre veldig lav.


Kunngjøringer :

Artikkelmodulen vil snart bli tilgjengelig!