Làm cách nào để chuyển đổi từ BLOB sang văn bản trong MySQL?


214

Tôi có rất nhiều bản ghi trong đó văn bản đã được lưu trữ trong một blob trong MySQL. Để dễ xử lý, tôi muốn thay đổi định dạng trong cơ sở dữ liệu thành văn bản ... Mọi ý tưởng có thể dễ dàng thực hiện thay đổi để không làm gián đoạn dữ liệu - Tôi đoán nó sẽ cần được mã hóa đúng cách?

Câu trả lời:


258

Điều đó là không cần thiết. Chỉ cần sử dụng SELECT CONVERT(column USING utf8) FROM..... thay vì chỉ SELECT column FROM...


24
Cách sử dụng:SELECT CONVERT(column USING utf8) FROM table;
bmaupin

4
Điều này hoạt động rất tốt cho những GROUP_CONCAT chuyển đổi đầu ra của bạn thành các đốm màu và bạn thực sự muốn chúng dưới dạng chuỗi. Tôi gặp vấn đề tương tự như OP khi sử dụng Node.JS với thư viện nút-mysql - điều này đã khắc phục tất cả các vấn đề của group_concat.
marksyzm

Công việc này và cũng có thể sử dụng với truy vấn nóng như CONVERT (LEFT (MD5 ([ID]), 8) SỬ DỤNG utf8)
ZenithS

Điều này sẽ không làm việc. Bộ ký tự cần phải là utf16 nếu không nó sẽ dẫn đến mất dữ liệu nếu gặp một tập hợp byte không thể chuyển đổi thành utf8. Nó sẽ thay thế các byte bằng một? ký tự dẫn đến mất dữ liệu.
Trưởng khoa hoặc

128

Dưới đây là ví dụ về một người muốn chuyển đổi blob thành char (1000) với mã hóa UTF-8 :

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

Đây là câu trả lời của anh ấy. Có lẽ có nhiều hơn nữa bạn có thể đọc về CAST ngay tại đây . Tôi hy vọng nó sẽ giúp một số.


5
Thật không may, điều này không làm việc cho tôi. Tôi nhận được các hàng trống và đôi khi chỉ có đầu ra 1 ký tự với các ký hiệu lạ.
C4d

Cũng đã làm việc trong truy vấn chọn, chọn A.id, CAST (B.content AS CHAR (10000) CHARACTER SET utf8) làm nội dung, Bb từ A tham gia B ON B.content_id = A.content_id
dkb

15

Tôi đã có cùng một vấn đề, và đây là giải pháp của tôi:

  1. tạo các cột mới của văn bản loại trong bảng cho mỗi cột blob
  2. chuyển đổi tất cả các đốm màu thành văn bản và lưu chúng trong các cột mới
  3. xóa các cột blob
  4. đổi tên các cột mới thành tên của các cột bị loại bỏ
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
Đây là câu trả lời duy nhất có hiệu quả với tôi, cảm ơn :)
Tom

Các cột trung gian đã thực hiện các mẹo. Giữ các lỗi trích dẫn các ký tự xấu thông qua tất cả các phương pháp và câu trả lời khác. Cảm ơn
gillytech

8

Bạn có thể làm điều đó rất dễ dàng.

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

Các truy vấn trên làm việc cho tôi. Tôi hy vọng nó cũng giúp bạn.


8

Nếu bạn đang sử dụng MYSQL-WORKBENCH , thì bạn có thể chọn cột blob bình thường và nhấp chuột phải vào cột và nhấp vào giá trị mở trong trình chỉnh sửa . tham khảo ảnh chụp màn hình:

ảnh chụp màn hình


2

Hoặc bạn có thể sử dụng chức năng này:

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

Ảnh chụp màn hình phpMyAdmin Sử dụng phpMyAdmin, bạn cũng có thể đặt các tùy chọn để hiển thị nội dung BLOB và hiển thị văn bản hoàn chỉnh.


Làm thế nào chính xác ai đó sẽ đi về làm điều này? Câu trả lời của bạn sẽ hữu ích hơn nhiều nếu bạn đăng một số mã và / hoặc ảnh chụp màn hình chi tiết như vậy.
TrampolineTales

0

Không có câu trả lời nào trong số này làm việc cho tôi. Khi chuyển đổi sang UTF8, khi bộ mã hóa gặp một tập hợp byte, nó không thể chuyển đổi thành UTF8, nó sẽ dẫn đến một? thay thế dẫn đến mất dữ liệu. Bạn cần sử dụng 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)

Bạn có thể kiểm tra các giá trị nhị phân trong MySQL Workbench. Nhấp chuột phải vào trường -> Mở giá trị trong Trình xem-> Nhị phân. Khi được chuyển đổi trở lại BINary, các giá trị nhị phân phải giống với giá trị gốc.

Ngoài ra, bạn chỉ có thể sử dụng cơ sở 64 được tạo ra cho mục đích này:

SELECT
    blobfield,
    TO_BASE64(blobfield),
    FROM_BASE64(TO_BASE64(blobfield))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.