Як конвертувати з BLOB в TEXT в MySQL?


214

У мене є чимало записів, де текст зберігався в краплі в MySQL. Для зручності роботи я хотів би змінити формат у базі даних на ТЕКСТ ... Будь-які ідеї, як легко зробити зміни, щоб не перервати дані - я думаю, це потрібно буде правильно закодувати?

Відповіді:


258

Це зайве. Просто використовуйте SELECT CONVERT(column USING utf8) FROM..... замість просто SELECT column FROM...


24
Використання:SELECT CONVERT(column USING utf8) FROM table;
bmaupin

4
Це чудово підходить для тих GROUP_CONCAT, які перетворюють ваш вихід у краплі, і ви дійсно хочете їх як рядки. Під час використання Node.JS з бібліотекою node-mysql у мене виникла проблема, схожа на ОП - це виправляло всі проблеми group_concat.
marksyzm

Ця робота, а також може використовуватися з гарячими запитами, як CONVERT (ЛІВО (MD5 ([ID]), 8)) USING utf8)
ZenithS

Це не спрацює. Набір шаблону повинен бути utf16, інакше це призведе до втрати даних, якщо він зустріне набір байтів, які неможливо перетворити на utf8. Він замінить ці байти на? символу, що призводить до втрати даних.
Дін або

128

Ось приклад людини, яка хоче перетворити крапку в 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 приєднатися B ON B.content_id = A.content_id
dkb

15

У мене була така ж проблема, і ось моє рішення:

  1. створити нові стовпці тексту типу в таблиці для кожного стовпчика крапки
  2. конвертувати всі крапки в текст і зберегти їх у нових стовпцях
  3. видаліть колони краплі
  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 звичайно та клацнути правою кнопкою миші на стовпці та натиснути відкрите значення у редакторі . відновити скріншот:

скріншот


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 та показу повного тексту.


Як саме хтось піде робити це? Ваша відповідь буде набагато кориснішою, якщо ви опублікуєте якийсь код та / або скріншоти з деталізацією такого.
TrampolineTales

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.