MySQLでBLOBからTEXTに変換するにはどうすればよいですか?


214

MySQLのblobにテキストが保存されているレコードがたくさんあります。処理を簡単にするために、データベースの形式をTEXTに変更したいと思います...データを中断しないように変更を加えるのがいかに簡単かというアイデア-適切にエンコードする必要があると思いますか?

回答:


258

それは不要です。SELECT CONVERT(column USING utf8) FROM単にSELECT column FROM...の代わりに.....を使用してください...


24
使用法:SELECT CONVERT(column USING utf8) FROM table;
bmaupin

4
これは、出力をblobに変換するGROUP_CONCATに最適で、実際にはそれらを文字列として必要とします。node.mysqlライブラリーでNode.JSを使用しているときに、OPと同様の問題が発生しました-これにより、すべてのgroup_concatの問題が修正されました。
markyzm 2013

この作業は、CONVERT(LEFT(MD5([ID])、8)USING utf8)
ZenithS

これは機能しません。文字セットはutf16である必要があります。そうでない場合、utf8に変換できないバイトのセットを検出すると、データが失われます。それらのバイトを?に置き換えます。データが失われる文字。
ディーンまたは

128

これは、BLOBをUTF-8エンコーディングでchar(1000)に変換する人の例です。

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

これが彼の答えです。CASTについては、ここでさらに多くのことを読むことができます。少しでもお役に立てば幸いです。


5
残念ながら、これは私にはうまくいきません。空の行が表示され、奇妙な記号が1文字だけ出力される場合があります。
C4d 2015

選択クエリでも機能し、コンテンツとしてA.id、CAST(B.content AS CHAR(10000)CHARACTER SET utf8)を選択し、AからのBb B ON B.content_id = A.content_id
dkb

15

私は同じ問題を抱えていましたが、これが私の解決策です:

  1. 各BLOB列のテキスト型の新しい列をテーブルに作成する
  2. すべてのblobをテキストに変換し、新しい列に保存します
  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
これは私のために働いた唯一の答えです、ありがとう:)
Tom

中間のコラムでうまくやった。他のすべての方法と回答で不良文字を引用するエラーが発生し続けました。ありがとう
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でバイナリ値を検査できます。フィールドを右クリック->ビューアで値を開く->バイナリ。BINARYに戻すと、バイナリ値は元の値と同じになります。

または、この目的のために作成されたbase-64を使用することもできます。

SELECT
    blobfield,
    TO_BASE64(blobfield),
    FROM_BASE64(TO_BASE64(blobfield))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.