Comment convertir de BLOB en TEXT dans MySQL?


214

J'ai beaucoup d'enregistrements où le texte a été stocké dans un blob dans MySQL. Pour faciliter la manipulation, j'aimerais changer le format de la base de données en TEXTE ... Des idées sur la facilité avec laquelle effectuer le changement afin de ne pas interrompre les données - je suppose qu'il devra être encodé correctement?

Réponses:


259

C'est inutile. Utilisez simplement SELECT CONVERT(column USING utf8) FROM..... au lieu de simplement SELECT column FROM...


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

4
Cela fonctionne très bien pour les GROUP_CONCAT qui convertissent votre sortie en objets blob et vous les voulez vraiment en tant que chaînes. J'ai eu un problème similaire aux OP lors de l'utilisation de Node.JS avec la bibliothèque node-mysql - cela a résolu tous les problèmes group_concat.
marksyzm

Ce travail, et peut également être utilisé avec une requête à chaud comme CONVERT (LEFT (MD5 ([ID]), 8) USING utf8)
ZenithS

Ça ne marchera pas. Le jeu de caractères doit être utf16, sinon il entraînera une perte de données s'il rencontre un ensemble d'octets qui ne peut pas être converti en utf8. Il remplacera ces octets par un? entraînant une perte de données.
Dean Or

128

Voici un exemple d' une personne qui souhaite convertir un blob en char (1000) avec le codage UTF-8 :

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

Telle est sa réponse. Il y a probablement beaucoup plus à lire sur CAST ici . J'espère que cela aide certains.


5
Malheureusement, cela ne fonctionne pas pour moi. J'obtiens des lignes vides et parfois seulement une sortie à 1 caractère avec des symboles étranges.
C4d

A également fonctionné dans la requête de sélection, sélectionnez A.id, CAST (B.content AS CHAR (10000) CHARACTER SET utf8) comme contenu, Bb from A join B ON B.content_id = A.content_id
dkb

15

J'ai eu le même problème, et voici ma solution:

  1. créer de nouvelles colonnes de type texte dans le tableau pour chaque colonne d'objets blob
  2. convertir tous les blobs en texte et les enregistrer dans les nouvelles colonnes
  3. supprimer les colonnes d'objets blob
  4. renommer les nouvelles colonnes en noms de celles supprimées
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
C'est la seule réponse qui a fonctionné pour moi, merci :)
Tom

La colonne intermédiaire a fait l'affaire. J'ai continué à obtenir des erreurs en citant de mauvais caractères via toutes les autres méthodes et réponses. Merci
gillytech

8

Vous pouvez le faire très facilement.

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

La requête ci-dessus a fonctionné pour moi. J'espère que ça vous aide aussi.


8

Si vous utilisez MYSQL-WORKBENCH , vous pouvez sélectionner la colonne de blob normalement et cliquer avec le bouton droit sur la colonne et cliquer sur ouvrir la valeur dans l'éditeur . voir capture d'écran:

capture d'écran


qui montre juste des hiéroglyphes
veritaS

2

Ou vous pouvez utiliser cette fonction:

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

Capture d'écran de phpMyAdmin En utilisant phpMyAdmin, vous pouvez également définir les options pour afficher le contenu BLOB et afficher le texte complet.


Comment exactement procéderait-on? Votre réponse sera beaucoup plus utile si vous publiez du code et / ou des captures d'écran les détaillant.
TrampolineTales

0

Aucune de ces réponses n'a fonctionné pour moi. Lors de la conversion en UTF8, lorsque l'encodeur rencontre un ensemble d'octets qu'il ne peut pas convertir en UTF8, il en résulte un? substitution qui entraîne une perte de données. Vous devez utiliser 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)

Vous pouvez inspecter les valeurs binaires dans MySQL Workbench. Faites un clic droit sur le champ -> Ouvrir la valeur dans la visionneuse -> Binaire. Lorsqu'elles sont reconverties en BINARY, les valeurs binaires doivent être identiques à l'original.

Alternativement, vous pouvez simplement utiliser la base-64 qui a été conçue à cet effet:

SELECT
    blobfield,
    TO_BASE64(blobfield),
    FROM_BASE64(TO_BASE64(blobfield))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.