Wie konvertiere ich in MySQL von BLOB zu TEXT?

214

Ich habe eine ganze Reihe von Datensätzen, in denen Text in einem Blob in MySQL gespeichert wurde. Zur Vereinfachung der Handhabung möchte ich das Format in der Datenbank in TEXT ändern ... Irgendwelche Ideen, wie einfach die Änderung vorgenommen werden kann, um die Daten nicht zu unterbrechen - ich denke, sie müssen ordnungsgemäß codiert werden?

Peter Mortensen
quelle

Antworten:

258

Das ist unnötig. Verwenden Sie einfach SELECT CONVERT(column USING utf8) FROM..... statt nur SELECT column FROM...

Yuma
quelle
24
Verwendung:SELECT CONVERT(column USING utf8) FROM table;
Bmaupin
4
Dies funktioniert hervorragend für GROUP_CONCATs, die Ihre Ausgabe in Blobs konvertieren, und Sie möchten sie wirklich als Zeichenfolgen. Ich hatte ein ähnliches Problem wie die OPs bei der Verwendung von Node.JS mit der Node-MySQL-Bibliothek - dies behebt alle group_concat-Probleme.
Marksyzm
Diese Arbeit und kann auch mit heißen Abfragen wie CONVERT (LEFT (MD5 ([ID]), 8) USING utf8)
ZenithS
Das wird nicht funktionieren. Der Zeichensatz muss utf16 sein, sonst führt dies zu Datenverlust, wenn er auf eine Reihe von Bytes stößt, die nicht in utf8 konvertiert werden können. Es wird diese Bytes durch ein? Ersetzen. Zeichen, das zu Datenverlust führt.
Dean oder
128

Hier ist ein Beispiel für eine Person , die einen Blob mit UTF-8- Codierung in char (1000) konvertieren möchte :

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

Das ist seine Antwort. Es ist wahrscheinlich viel mehr Sie über CAST lesen können direkt hier . Ich hoffe es hilft einigen.

Ólafur Waage
quelle
5
Leider funktioniert das bei mir nicht. Ich bekomme leere Zeilen und manchmal nur eine 1-Zeichen-Ausgabe mit seltsamen Symbolen.
C4d
Auch in der Auswahlabfrage gearbeitet, wählen Sie A.id, CAST (B.content AS CHAR (10000) CHARACTER SET utf8) als Inhalt, Bb von A Join B ON B.content_id = A.content_id
dkb
15

Ich hatte das gleiche Problem und hier ist meine Lösung:

  1. Erstellen Sie für jede Blob-Spalte neue Spalten vom Typ Text in der Tabelle
  2. Konvertieren Sie alle Blobs in Text und speichern Sie sie in den neuen Spalten
  3. Entfernen Sie die Blob-Spalten
  4. Benennen Sie die neuen Spalten in die Namen der entfernten um
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
quelle
2
Dies ist die einzige Antwort, die für mich funktioniert hat, danke :)
Tom
Die Zwischensäule hat es geschafft. Fehler beim Zitieren von schlechten Zeichen über alle anderen Methoden und Antworten erhalten. Danke
Gillytech
8

Sie können es sehr einfach tun.

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

Die obige Abfrage hat bei mir funktioniert. Ich hoffe es hilft dir auch.

Jignesh Mesvaniya
quelle
8

Wenn Sie MYSQL-WORKBENCH verwenden , können Sie die Blob-Spalte normal auswählen und mit der rechten Maustaste auf die Spalte klicken und im Editor auf Wert öffnen klicken . siehe Screenshot:

Bildschirmfoto

Ankit
quelle
2

Oder Sie können diese Funktion verwenden:

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

phpMyAdmin Screenshot Mit phpMyAdmin können Sie auch die Optionen festlegen, um BLOB-Inhalte und vollständigen Text anzuzeigen.

marcosn
quelle
Wie genau würde jemand das tun? Ihre Antwort ist viel hilfreicher, wenn Sie Code und / oder Screenshots veröffentlichen, in denen dies detailliert beschrieben wird.
TrampolineTales
0

Keine dieser Antworten hat bei mir funktioniert. Wenn der Encoder bei der Konvertierung in UTF8 auf eine Reihe von Bytes stößt, die er nicht in UTF8 konvertieren kann, führt dies zu einem? Substitution, die zu Datenverlust führt. Sie müssen UTF16 verwenden:

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)

Sie können die Binärwerte in MySQL Workbench überprüfen. Klicken Sie mit der rechten Maustaste auf das Feld -> Wert in Viewer öffnen -> Binär. Bei der Rückkonvertierung in BINARY sollten die Binärwerte mit denen des Originals übereinstimmen.

Alternativ können Sie auch base-64 verwenden, das für diesen Zweck erstellt wurde:

SELECT
    blobfield,
    TO_BASE64(blobfield),
    FROM_BASE64(TO_BASE64(blobfield))
Dean Or. En
quelle