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.