MySQL'de BLOB'dan TEXT'e nasıl dönüştürebilirim?


214

Metin MySQL bir blob saklandığı bir sürü kayıt var. Kullanım kolaylığı için veritabanındaki formatı METİN olarak değiştirmek istiyorum ... Verileri kesintiye uğratmamak için değişikliği ne kadar kolay yapabileceğime dair herhangi bir fikir - sanırım düzgün bir şekilde kodlanması gerekecek mi?

Yanıtlar:


258

Bu gereksiz. Sadece kullanın SELECT CONVERT(column USING utf8) FROM..... sadece yerine SELECT column FROM...


24
Kullanım:SELECT CONVERT(column USING utf8) FROM table;
bmaupin

4
Bu, çıktınızı lekelere dönüştüren GROUP_CONCAT'ler için harika çalışır ve bunları gerçekten dizeler olarak kullanmak istersiniz. Düğüm-mysql kitaplığı ile Node.JS kullanırken OP benzer bir sorun vardı - bu tüm group_concat sorunları düzeltildi.
marksyzm

Bu çalışma ve ayrıca CONVERT (SOL (MD5 ([ID]), 8) utf8 KULLANMA)
ZenithS

Bu işe yaramaz. Karakter kümesinin utf16 olması gerekir, aksi takdirde utf8'e dönüştürülemeyen bir bayt kümesiyle karşılaşırsa veri kaybına neden olur. Bu baytları bir? veri kaybı ile sonuçlanan karakter.
Dean Veya

128

UTF-8 kodlamasıyla bir blob'u char (1000) 'e dönüştürmek isteyen bir kişinin örneği :

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

Bu onun cevabı. Muhtemelen burada CAST hakkında daha fazla şey okuyabilirsiniz . Umarım bazılarına yardımcı olur.


5
Ne yazık ki bu benim için çalışmıyor. Boş satırlar ve bazen sadece garip sembollerle 1 karakterlik bir çıktı alıyorum.
C4d

Sıra select sorgusunda çalıştı, A.id içerik olarak, CAST (B.content AS CHAR (10000) KARAKTER SETİ utf8), A'dan Bb B AÇIK B.content_id = A.content_id katılmak seçmek
DKB

15

Aynı sorunu yaşadım ve işte benim çözümüm:

  1. her damla sütunu için tabloda yeni tip metin sütunları oluşturun
  2. tüm lekeleri metne dönüştürün ve yeni sütunlara kaydedin
  3. damla sütunlarını kaldır
  4. yeni sütunları kaldırılanların adlarıyla yeniden adlandırın
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
Benim için çalışan tek cevap bu, teşekkürler :)
Tom

Ara sütun hile yaptı. Diğer tüm yöntemler ve yanıtlar aracılığıyla kötü karakterlere atıfta bulunarak hatalar almaya devam etti. Teşekkürler
gillytech

8

Çok kolay bir şekilde yapabilirsiniz.

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

Yukarıdaki sorgu benim için çalıştı. Umarım sana da yardımcı olur.


8

MYSQL-WORKBENCH kullanıyorsanız , blob sütununu normal olarak seçebilir ve sütuna sağ tıklayıp değeri editörde aç'a tıklayabilirsiniz . ekran görüntüsüne bakın:

ekran görüntüsü


2

Veya bu işlevi kullanabilirsiniz:

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 ekran görüntüsü PhpMyAdmin'i kullanarak BLOB içeriğini gösterme ve tam metni gösterme seçeneklerini de ayarlayabilirsiniz.


Birisi bunu tam olarak nasıl yapardı? Böyle bir kod ve / veya ekran görüntüsü yayınlarsanız cevabınız çok daha yararlı olacaktır.
TrampolineTales

0

Bu cevapların hiçbiri benim için işe yaramadı. UTF8'e dönüştürürken, kodlayıcı bir bayt kümesiyle karşılaştığında UTF8'e dönüştürülemez? veri kaybına yol açan ikame. UTF16 kullanmanız gerekir:

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)

İkili değerleri MySQL Workbench'te inceleyebilirsiniz. Alanı sağ tıklayın -> Görüntüleyicide Değer Aç-> İkili. İKİLİ'ye geri dönüştürüldüğünde, ikili değerler orijinal ile aynı olmalıdır.

Alternatif olarak, sadece bu amaçla yapılmış taban-64'ü kullanabilirsiniz:

SELECT
    blobfield,
    TO_BASE64(blobfield),
    FROM_BASE64(TO_BASE64(blobfield))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.