¿Cómo convierto de BLOB a TEXT en MySQL?

214

Tengo muchos registros donde el texto se ha almacenado en un blob en MySQL. Para facilitar el manejo, me gustaría cambiar el formato de la base de datos a TEXTO ... ¿Alguna idea de qué tan fácil hacer el cambio para no interrumpir los datos? Supongo que será necesario codificarlo correctamente.

Peter Mortensen
fuente

Respuestas:

258

Eso es innecesario Solo usa SELECT CONVERT(column USING utf8) FROM..... en lugar de solo SELECT column FROM...

Yuma
fuente
24
Uso:SELECT CONVERT(column USING utf8) FROM table;
bmaupin
44
Esto funciona muy bien para esos GROUP_CONCAT que convierten su salida en blobs y realmente los quiere como cadenas. Tuve un problema similar a los OP al usar Node.JS con la biblioteca node-mysql; esto solucionó todos los problemas de group_concat.
marksyzm
Este trabajo, y también se puede usar con consultas calientes como CONVERT (IZQUIERDA (MD5 ([ID]), 8) USANDO utf8)
ZenithS
Esto no funcionara. El conjunto de caracteres debe ser utf16 o, de lo contrario, provocará la pérdida de datos si encuentra un conjunto de bytes que no se pueden convertir a utf8. Reemplazará esos bytes con un? carácter que resulta en pérdida de datos.
Dean o el
128

Aquí hay un ejemplo de una persona que quiere convertir un blob a char (1000) con codificación UTF-8 :

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

Esta es su respuesta. Probablemente hay mucho más que puedes leer sobre CAST aquí . Espero que ayude un poco.

Ólafur Waage
fuente
55
Lamentablemente esto no funciona para mí. Obtengo filas vacías y, a veces, solo una salida de 1 carácter con símbolos extraños.
C4d
También funcionó en la consulta de selección, seleccione A.id, CAST (B.content AS CHAR (10000) CHARACTER SET utf8) como contenido, Bb de A join B ON B.content_id = A.content_id
dkb
15

He tenido el mismo problema, y ​​aquí está mi solución:

  1. crear nuevas columnas de texto tipo en la tabla para cada columna de blob
  2. Convierta todos los blobs en texto y guárdelos en las nuevas columnas
  3. eliminar las columnas de blob
  4. cambiar el nombre de las nuevas columnas a los nombres de las eliminadas
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
fuente
2
Esta es la única respuesta que funcionó para mí, gracias :)
Tom
La columna intermedia hizo el truco. Seguía recibiendo errores citando caracteres malos a través de todos los demás métodos y respuestas. Gracias
gillytech
8

Puedes hacerlo muy fácilmente.

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

La consulta anterior funcionó para mí. Espero que te ayude a ti también.

Jignesh Mesvaniya
fuente
8

Si está utilizando MYSQL-WORKBENCH , puede seleccionar la columna de blob normalmente y hacer clic derecho en la columna y hacer clic en abrir valor en el editor . referir captura de pantalla:

captura de pantalla

ankit
fuente
2

O puede usar esta función:

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
fuente
1

Captura de pantalla de phpMyAdmin Usando phpMyAdmin también puede configurar las opciones para mostrar contenido BLOB y mostrar texto completo.

marcosn
fuente
¿Cómo exactamente alguien haría esto? Su respuesta será mucho más útil si publica algún código y / o capturas de pantalla que detallen tal.
TrampolineTales
0

Ninguna de estas respuestas funcionó para mí. Al convertir a UTF8, cuando el codificador encuentra un conjunto de bytes que no puede convertir a UTF8, ¿se generará un? sustitución que resulta en pérdida de datos. Necesita usar 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)

Puede inspeccionar los valores binarios en MySQL Workbench. Haga clic derecho en el campo -> Abrir valor en Visor-> Binario. Cuando se vuelve a convertir a BINARY, los valores binarios deben ser los mismos que los del original.

Alternativamente, puede usar base-64 que fue hecho para este propósito:

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