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.