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ć?

Odpowiedzi:


258

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


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.


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;

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.


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


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 ;

1

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


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))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.