Jak przekonwertować z BLOB na TEXT w MySQL?

214

Mam wiele rekordów, w których tekst został zapisany w obiekcie blob w MySQL. Dla ułatwienia obsługi chciałbym zmienić format bazy danych na TEKST ... Jakieś pomysły, jak łatwo wprowadzić zmiany, aby nie przerywać danych - Myślę, że będzie trzeba odpowiednio zakodować?

Peter Mortensen
źródło

Odpowiedzi:

258

To niepotrzebne. Po prostu użyj SELECT CONVERT(column USING utf8) FROM..... zamiast po prostu SELECT column FROM...

Yuma
źródło
24
Zastosowanie:SELECT CONVERT(column USING utf8) FROM table;
bmaupin
4
Działa to świetnie dla tych grup GROUP_CONCAT, które przekształcają dane wyjściowe w obiekty BLOB i naprawdę chcesz, aby były one ciągami znaków. Miałem problem podobny do OP podczas korzystania z Node.JS z biblioteką node-mysql - to naprawiło wszystkie problemy group_concat.
marksyzm
Praca ta, a także mogą korzystać z gorącym zapytania jak konwertowania (lewa (MD5 ([id]), 8), stosując UTF8)
ZenithS
To nie zadziała. Zestawem znaków musi być utf16, w przeciwnym razie spowoduje utratę danych, jeśli napotka zestaw bajtów, których nie można przekonwertować na utf8. Zastąpi te bajty znakiem? znak powodujący utratę danych.
Dziekan lub
128

Oto przykład osoby, która chce przekonwertować obiekt blob na char (1000) z kodowaniem UTF-8 :

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

To jest jego odpowiedź. Prawdopodobnie o CAST można przeczytać tutaj . Mam nadzieję, że to pomoże.

Lalafur Waage
źródło
5
Niestety to nie działa dla mnie. Dostaję puste wiersze i czasami tylko 1-znakowy wynik z dziwnymi symbolami.
C4d,
Pracował również w przypadku wyboru zapytania, wybierz A.id, CAST (B.content AS CHAR (10000) CHARACTER SET utf8) jako treść, Bb z A dołącz do B ON B.content_id = A.content_id
dkb
15

Miałem ten sam problem i oto moje rozwiązanie:

  1. utwórz nowe kolumny tekstu w tabeli dla każdej kolumny obiektów blob
  2. przekonwertuj wszystkie obiekty BLOB na tekst i zapisz je w nowych kolumnach
  3. usuń kolumny obiektów blob
  4. zmień nazwę nowych kolumn na nazwy usuniętych
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
źródło
2
To jedyna odpowiedź, która zadziałała dla mnie, dzięki :)
Tom
Pośrednia kolumna załatwiła sprawę. Utrzymywanie błędów związanych z cytowaniem złych znaków za pomocą wszystkich innych metod i odpowiedzi. Dzięki
gillytech
8

Możesz to zrobić bardzo łatwo.

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

Powyższe zapytanie działało dla mnie. Mam nadzieję, że ci to pomoże.

Jignesh Mesvaniya
źródło
8

Jeśli używasz MYSQL-WORKBENCH , możesz normalnie wybrać kolumnę obiektów blob i kliknąć kolumnę prawym przyciskiem myszy i kliknąć otwartą wartość w edytorze . patrz zrzut ekranu:

zrzut ekranu

ankit
źródło
2

Lub możesz użyć tej funkcji:

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
źródło
1

Zrzut ekranu phpMyAdmin Za pomocą phpMyAdmin możesz także ustawić opcje wyświetlania zawartości BLOB i wyświetlania pełnego tekstu.

Marcosn
źródło
Jak dokładnie ktoś by to zrobił? Twoja odpowiedź będzie znacznie bardziej pomocna, jeśli opublikujesz jakiś kod i / lub zrzuty ekranu zawierające takie szczegóły.
TrampolineTales
0

Żadna z tych odpowiedzi nie działała dla mnie. Kiedy konwertując na UTF8, koder napotka zestaw bajtów, których nie może przekonwertować na UTF8, spowoduje to? podstawienie, które powoduje utratę danych. Musisz użyć 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)

Możesz sprawdzić wartości binarne w MySQL Workbench. Kliknij prawym przyciskiem myszy pole -> Otwórz wartość w przeglądarce -> Binarne. Po konwersji z powrotem na BINARY wartości binarne powinny być takie same jak oryginalne.

Alternatywnie możesz po prostu użyć base-64, który został stworzony w tym celu:

SELECT
    blobfield,
    TO_BASE64(blobfield),
    FROM_BASE64(TO_BASE64(blobfield))
Dean Or
źródło