Come faccio a convertire da BLOB a TEXT in MySQL?


214

Ho un sacco di dischi in cui il testo è stato archiviato in un BLOB in MySQL. Per semplicità di utilizzo, vorrei cambiare il formato nel database in TESTO ... Qualche idea su come apportare facilmente la modifica per non interrompere i dati? Immagino che dovrà essere codificato correttamente?

Risposte:


259

Non è necessario. Usa solo SELECT CONVERT(column USING utf8) FROM..... invece di SELECT column FROM...


24
Utilizzo:SELECT CONVERT(column USING utf8) FROM table;
bmaupin,

4
Funziona benissimo per quei GROUP_CONCAT che convertono il tuo output in BLOB e li vuoi davvero come stringhe. Ho riscontrato un problema simile agli OP durante l'utilizzo di Node.JS con la libreria node-mysql: questo ha risolto tutti i problemi di group_concat.
Markyzm,

Questo lavoro, e può anche essere utilizzato con query di ricerca come CONVERT (SINISTRA (MD5 ([ID]), 8) USANDO utf8)
ZenithS

Questo non funzionerà. Il set di caratteri deve essere utf16, altrimenti si verificherà una perdita di dati se incontra un set di byte che non può essere convertito in utf8. Sostituirà quei byte con un? carattere con conseguente perdita di dati.
Decano o

128

Ecco un esempio di una persona che vuole convertire un BLOB in char (1000) con codifica UTF-8 :

CAST(a.ar_options AS CHAR(10000) CHARACTER SET utf8)

Questa è la sua risposta Probabilmente c'è molto di più che puoi leggere su CAST proprio qui . Spero che sia di aiuto.


5
Purtroppo questo non funziona per me. Ottengo righe vuote e talvolta solo un output di 1 carattere con strani simboli.
C4d,

Ha funzionato anche in query selezionate, selezionare A.id, CAST (B.content AS CHAR (10000) CHARACTER SET utf8) come contenuto, Bb da A join B ON B.content_id = A.content_id
dkb

15

Ho avuto lo stesso problema, ed ecco la mia soluzione:

  1. creare nuove colonne di tipo testo nella tabella per ogni colonna BLOB
  2. converti tutti i BLOB in testo e salvali nelle nuove colonne
  3. rimuovere le colonne BLOB
  4. rinominare le nuove colonne con i nomi di quelle rimosse
ALTER TABLE mytable
ADD COLUMN field1_new TEXT NOT NULL,
ADD COLUMN field2_new TEXT NOT NULL;

update mytable set
field1_new = CONVERT(field1 USING utf8),
field2_new = CONVERT(field2 USING utf8);

alter table mytable
drop column field1,
drop column field2;

alter table mytable
change column field1_new field1 text,
change column field2_new field2 text;

2
Questa è l'unica risposta che ha funzionato per me, grazie :)
Tom,

La colonna intermedia ha funzionato. Continuava a ricevere errori citando caratteri cattivi tramite tutti gli altri metodi e risposte. Grazie
gillytech,

8

Puoi farlo molto facilmente.

ALTER TABLE `table_name` CHANGE COLUMN `column_name` `column_name` LONGTEXT NULL DEFAULT NULL ;

La query sopra ha funzionato per me. Spero aiuti anche te.


8

Se si utilizza MYSQL-WORKBENCH , è possibile selezionare normalmente la colonna BLOB e fare clic con il tasto destro sulla colonna e fare clic su Apri valore nell'editor . fare riferimento allo screenshot:

immagine dello schermo


che mostra solo i geroglifici
veritaS

2

Oppure puoi usare questa funzione:

DELIMITER $$

CREATE FUNCTION BLOB2TXT (blobfield VARCHAR(255)) RETURNS longtext
DETERMINISTIC
NO SQL
BEGIN
       RETURN CAST(blobfield AS CHAR(10000) CHARACTER SET utf8);
END
$$


DELIMITER ;

1

screenshot di phpMyAdmin Usando phpMyAdmin puoi anche impostare le opzioni per mostrare il contenuto BLOB e mostrare il testo completo.


Come esattamente qualcuno farebbe questo? La tua risposta sarà molto più utile se pubblichi un codice e / o schermate con dettagli simili.
TrampolineTales

0

Nessuna di queste risposte ha funzionato per me. Quando si converte in UTF8, quando l'encoder rileva un set di byte che non può convertire in UTF8, si otterrà un? sostituzione che comporta la perdita di dati. Devi usare UTF16:

SELECT
    blobfield,
    CONVERT(blobfield USING utf16),
    CONVERT(CONVERT(blobfield USING utf16), BINARY),
    CAST(blobfield  AS CHAR(10000) CHARACTER SET utf16),
    CAST(CAST(blobfield  AS CHAR(10000) CHARACTER SET utf16) AS BINARY)

Puoi controllare i valori binari in MySQL Workbench. Fare clic destro sul campo -> Apri valore nel Visualizzatore-> Binario. Quando convertiti in BINARY, i valori binari dovrebbero essere gli stessi dell'originale.

In alternativa, puoi semplicemente usare la base 64 creata per questo scopo:

SELECT
    blobfield,
    TO_BASE64(blobfield),
    FROM_BASE64(TO_BASE64(blobfield))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.