Como faço para converter de BLOB para TEXT no MySQL?

214

Eu tenho muitos registros em que o texto foi armazenado em um blob no MySQL. Para facilitar o manuseio, gostaria de alterar o formato do banco de dados para TEXTO ... Alguma idéia de como é fácil fazer a alteração para não interromper os dados - acho que precisará ser codificado corretamente?

Peter Mortensen
fonte

Respostas:

258

Isso é desnecessário. Basta usar SELECT CONVERT(column USING utf8) FROM... em vez de apenas SELECT column FROM...

Yuma
fonte
24
Uso:SELECT CONVERT(column USING utf8) FROM table;
bmaupin
4
Isso funciona muito bem para os GROUP_CONCATs que convertem sua saída em blobs e você realmente os deseja como strings. Eu tive um problema semelhante ao do OP ao usar o Node.JS com a biblioteca node-mysql - isso corrigiu todos os problemas do group_concat.
marksyzm
Este trabalho, e também pode usar com consulta quente como CONVERT (LEFT (MD5 ([ID]), 8) UTILIZAÇÃO utf8)
CénitS
Isso não vai funcionar. O conjunto de caracteres precisa ser utf16, caso contrário, resultará em perda de dados se encontrar um conjunto de bytes que não podem ser convertidos em utf8. Ele substituirá esses bytes por um? caractere resultando em perda de dados.
22419 Dean Ou Dean
128

Aqui está um exemplo de pessoa que deseja converter um blob em char (1000) com codificação UTF-8 :

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

Essa é a resposta dele. Provavelmente há muito mais sobre o CAST aqui . Espero que ajude alguns.

Ólafur Waage
fonte
5
Infelizmente isso não está funcionando para mim. Recebo linhas vazias e, às vezes, apenas uma saída de 1 caractere com símbolos estranhos.
C4d #
Trabalhou também na consulta de seleção, selecione A.id, CAST (B.content AS CHAR (10000) CHARACTER SET utf8) como conteúdo, Bb de A junção A B B.content_id = A.content_id
dkb
15

Eu tive o mesmo problema e aqui está a minha solução:

  1. crie novas colunas do tipo texto na tabela para cada coluna de blob
  2. converta todos os blobs em texto e salve-os nas novas colunas
  3. remova as colunas do blob
  4. renomeie as novas colunas para os nomes das removidas
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;
Asped
fonte
2
Esta é a única resposta que funcionou para mim, graças :)
Tom
A coluna intermediária fez o truque. Manteve erros ao citar caracteres incorretos através de todos os outros métodos e respostas. Graças
gillytech
8

Você pode fazer isso muito facilmente.

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

A consulta acima funcionou para mim. Espero que ajude você também.

Jignesh Mesvaniya
fonte
8

Se você estiver usando MYSQL-WORKBENCH , poderá selecionar a coluna blob normalmente e clicar com o botão direito do mouse na coluna e clicar em open value no editor . consulte a captura de tela:

captura de tela

ankit
fonte
2

Ou você pode usar esta função:

DELIMITER $$

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


DELIMITER ;
Adam Sánchez Ayte
fonte
1

Captura de tela do phpMyAdmin Usando o phpMyAdmin, você também pode definir as opções para mostrar o conteúdo do BLOB e mostrar o texto completo.

marcosn
fonte
Como exatamente alguém faria isso? Sua resposta será muito mais útil se você publicar algum código e / ou captura de tela detalhando isso.
TrampolineTales
0

Nenhuma dessas respostas funcionou para mim. Ao converter para UTF8, quando o codificador encontra um conjunto de bytes que não pode converter em UTF8, isso resultará em um? substituição que resulta em perda de dados. Você precisa usar o 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)

Você pode inspecionar os valores binários no MySQL Workbench. Clique com o botão direito do mouse no campo -> Abrir valor no visualizador-> Binário. Quando convertidos novamente em BINARY, os valores binários devem ser os mesmos que o original.

Como alternativa, você pode simplesmente usar a base-64 que foi criada para esse fim:

SELECT
    blobfield,
    TO_BASE64(blobfield),
    FROM_BASE64(TO_BASE64(blobfield))
Dean Or
fonte