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
이것은 출력을 얼룩으로 변환하고 실제로 문자열로 원하는 GROUP_CONCAT에 효과적입니다. node-mysql 라이브러리와 함께 Node.JS를 사용하는 동안 OP와 비슷한 문제가 발생했습니다. 이는 모든 group_concat 문제를 해결했습니다.
marksyzm

이 작품은, 또한 같은 뜨거운 쿼리와 함께 사용할 수있는 (LEFT (MD5 ([ID]), 8)을 사용하여 UTF8) CONVERT
ZenithS

작동하지 않습니다. 문자 세트는 utf16이어야합니다. 그렇지 않으면 utf8로 변환 할 수없는 바이트 세트가 발생하면 데이터가 손실됩니다. 해당 바이트를? 데이터 손실을 초래하는 문자.
Dean 또는

128

UTF-8 인코딩 으로 Blob을 char (1000)로 변환하려는 사람 의 예는 다음과 같습니다 .

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

이것이 그의 대답입니다. 당신은 CAST에 대해 읽을 수 많은 아마이 바로 여기 . 나는 그것이 도움이되기를 바랍니다.


5
불행히도 이것은 나를 위해 일하지 않습니다. 빈 행이 생기고 때로는 이상한 기호가있는 1 자 출력 만 나타납니다.
C4d

뿐만 아니라 선택 쿼리에서 일 A.id 컨텐츠로서, CAST (B.content AS CHAR (10000) 문자 집합 UTF8)는, A로부터 비비가 B ON B.content_id = A.content_id 가입 선택
DKB

15

나는 같은 문제가 있었고 여기 내 해결책이 있습니다.

  1. 각 Blob 열에 대해 테이블에 텍스트 유형의 새 열을 만듭니다.
  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
이것은 나를 위해 일한 유일한 대답입니다, 감사합니다 :)
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로 변환 할 수 없습니까? 대체는 데이터 손실을 초래합니다. 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.