Как мне конвертировать из BLOB в TEXT в MySQL?


214

У меня есть много записей, где текст был сохранен в BLOB-объекте в MySQL. Для простоты обработки я хотел бы изменить формат в базе данных на TEXT ... Есть идеи, как легко внести изменения, чтобы не прерывать данные - я думаю, это нужно будет правильно закодировать?

Ответы:


259

Это не нужно. Просто используйте SELECT CONVERT(column USING utf8) FROM..... вместо просто SELECT column FROM...


24
Использование:SELECT CONVERT(column USING utf8) FROM table;
bmaupin

4
Это прекрасно работает для тех GROUP_CONCAT, которые конвертируют ваш вывод в BLOB-объекты, и вы действительно хотите, чтобы они были в виде строк. У меня была проблема, похожая на OP при использовании Node.JS с библиотекой node-mysql - это исправило все проблемы group_concat.
марксизм

Эту работу, а также можно использовать с горячими запросами, такими как CONVERT (LEFT (MD5 ([ID]), 8) USING utf8)
ZenithS

Это не сработает. Кодировка должна быть utf16, иначе она приведет к потере данных, если встретится с набором байтов, которые не могут быть преобразованы в utf8. Он заменит эти байты на? символ, приводящий к потере данных.
декан или

128

Вот пример человека, который хочет преобразовать BLOB-объект в char (1000) с кодировкой UTF-8 :

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

Это его ответ. Существует , вероятно , гораздо больше , вы можете прочитать о CAST прямо здесь . Надеюсь, это поможет некоторым.


5
К сожалению, это не работает для меня. Я получаю пустые строки и иногда только 1-символьный вывод со странными символами.
C4d

Работал и в запросе выбора, в качестве содержимого выберите A.id, CAST (B.content AS CHAR (10000) CHARACTER SET utf8), Bb из A join B ON B.content_id = A.content_id
dkb

15

У меня была такая же проблема, и вот мое решение:

  1. создать новые столбцы типа текста в таблице для каждого столбца BLOB-объектов
  2. преобразовать все капли в текст и сохранить их в новых столбцах
  3. удалить столбцы BLOB-объектов
  4. переименуйте новые столбцы в имена удаленных
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
Это единственный ответ, который сработал для меня, спасибо :)
Том

Промежуточная колонна сделала свое дело. Продолжал получать ошибки, ссылаясь на плохих персонажей через все другие методы и ответы. Спасибо
gillytech

8

Вы можете сделать это очень легко.

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

Вышеуказанный запрос работал для меня. Я надеюсь, что это поможет вам тоже.


8

Если вы используете MYSQL-WORKBENCH , то вы можете выбрать столбец blob обычным способом , щелкнуть правой кнопкой мыши по столбцу и щелкнуть открыть значение в редакторе . см. скриншот:

Скриншот


это просто показывает иероглифы
veritaS

2

Или вы можете использовать эту функцию:

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

скриншот phpMyAdmin Используя phpMyAdmin, вы также можете настроить параметры отображения содержимого BLOB и отображения полного текста.


Как именно кто-то будет делать это? Ваш ответ будет намного полезнее, если вы опубликуете некоторый код и / или снимки экрана с подробным описанием.
Батутные

0

Ни один из этих ответов не работал для меня. При преобразовании в UTF8, когда кодировщик встречает набор байтов, он не может преобразовать в UTF8, это приведет к? замена, которая приводит к потере данных. Вам нужно использовать 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)

Вы можете проверить двоичные значения в MySQL Workbench. Щелкните правой кнопкой мыши по полю -> Открыть значение в Viewer-> Binary. При преобразовании обратно в BINARY двоичные значения должны совпадать с исходными.

В качестве альтернативы, вы можете просто использовать base-64, который был сделан для этой цели:

SELECT
    blobfield,
    TO_BASE64(blobfield),
    FROM_BASE64(TO_BASE64(blobfield))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.