ฉันจะแปลงจาก BLOB เป็น TEXT ใน MySQL ได้อย่างไร


214

ฉันมีบันทึกมากมายที่เก็บข้อความไว้ใน blob ใน MySQL เพื่อความสะดวกในการจัดการฉันต้องการเปลี่ยนรูปแบบในฐานข้อมูลเป็น TEXT ... ความคิดใด ๆ ที่ทำให้การเปลี่ยนแปลงง่ายขึ้นเพื่อไม่ให้ขัดจังหวะข้อมูล - ฉันเดาว่าจะต้องเข้ารหัสอย่างถูกต้องหรือไม่

คำตอบ:


258

นั่นไม่จำเป็น เพียงใช้SELECT CONVERT(column USING utf8) FROM..... แทนที่จะเป็นSELECT column FROM...


24
การใช้งาน:SELECT CONVERT(column USING utf8) FROM table;
bmaupin

4
วิธีนี้ใช้งานได้ดีสำหรับ GROUP_CONCATs ที่แปลงเอาต์พุตของคุณเป็น blobs และคุณต้องการให้เป็นสตริง ฉันมีปัญหาคล้ายกับ OP ในขณะที่ใช้ Node.JS กับ node-mysql library - สิ่งนี้แก้ไขปัญหา group_concat ทั้งหมด
markyzm

งานนี้และยังสามารถใช้กับข้อความค้นหายอดนิยมเช่นCONVERT (ซ้าย (MD5 ([ID]), 8) ใช้ utf8)
ZenithS

สิ่งนี้ใช้ไม่ได้ ชุดอักขระจะต้องเป็น utf16 มิฉะนั้นจะส่งผลให้ข้อมูลสูญหายหากพบชุดไบต์ที่ไม่สามารถแปลงเป็น utf8 ได้ มันจะแทนที่ไบต์เหล่านั้นด้วย? ตัวละครส่งผลให้ข้อมูลสูญหาย
คณบดีหรือ

128

นี่คือตัวอย่างของบุคคลที่ต้องการแปลง blob เป็น char (1,000) ด้วยการเข้ารหัส UTF-8 :

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

นี่คือคำตอบของเขา อาจมีมากขึ้นคุณสามารถอ่านเกี่ยวกับการโยนขวาที่นี่ ฉันหวังว่ามันจะช่วยได้บ้าง


5
น่าเสียดายที่นี่ใช้ไม่ได้กับฉัน ฉันได้แถวที่ว่างเปล่าและบางครั้งมีเพียงอักขระ 1 ตัวที่มีสัญลักษณ์แปลก ๆ
C4d

ทำงานในแบบสอบถามแบบใช้เลือกข้อมูลเช่นกันเลือก A.id, CAST (B.content AS CHAR (10,000) CHARACTER SET utf8) เป็นเนื้อหา Bb จาก A เข้าร่วม B ON B.content_id = A.content_id
dkb

15

ฉันมีปัญหาเดียวกันและนี่คือทางออกของฉัน:

  1. สร้างคอลัมน์ใหม่ของข้อความประเภทในตารางสำหรับแต่ละคอลัมน์หยด
  2. แปลง blobs ทั้งหมดเป็นข้อความและบันทึกไว้ในคอลัมน์ใหม่
  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
นี่เป็นคำตอบเดียวที่ได้ผลสำหรับฉันขอบคุณ :)
Tom

คอลัมน์กลางทำกลอุบาย เก็บข้อผิดพลาดที่อ้างถึงอักขระที่ไม่ดีผ่านวิธีการและคำตอบอื่น ขอบคุณ
gillytech

8

คุณสามารถทำได้ง่ายมาก

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

แบบสอบถามด้านบนใช้งานได้สำหรับฉัน ฉันหวังว่ามันจะช่วยคุณเช่นกัน


8

หากคุณกำลังใช้MySQL ที่ WORKBENCHแล้วคุณสามารถเลือกคอลัมน์หยดตามปกติและคลิกขวาที่คอลัมน์และคลิกค่าเปิดในการแก้ไข ดูภาพหน้าจอ:

ภาพหน้าจอ


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 ได้จะส่งผลให้ a? การทดแทนซึ่งส่งผลให้ข้อมูลสูญหาย คุณต้องใช้ 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 คลิกขวาที่ฟิลด์ -> Open Value ใน Viewer-> Binary เมื่อแปลงกลับเป็น BINARY ค่าไบนารีควรเหมือนกันกับค่าดั้งเดิม

หรือคุณสามารถใช้ base-64 ซึ่งสร้างขึ้นเพื่อจุดประสงค์นี้:

SELECT
    blobfield,
    TO_BASE64(blobfield),
    FROM_BASE64(TO_BASE64(blobfield))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.