2016-09-16 6 views
0

최근에 latin1에서 utf-8로 MySQL 데이터베이스를 변환했습니다. 모두 BLOB 컬럼과 잘 어울립니다. 예를 들어,이 필드에는 잘못된 문자가 '다이아몬드의 물음표'로 표시됩니다.MySQL에서 BLOB 필드의 charset을 UTF-8로 변환합니다.

이 데이터를 BLOB에서 가져온다면 PHP의 utf8_encode()를 통해 실행하면 정상적으로 표시됩니다. 또한 UTF8_encode()에서 blob 필드로 데이터를 저장하면 더 이상 uf8_encode()를 호출 할 필요가 없습니다.

PHP 개입없이 BLOB 데이터를 변환하려면 어떻게해야합니까?

UPDATE 1 통과 (19 년 9 월 2016) :

나는 텍스트 필드에 걸쳐 BLOB를 복사하려고했으나 오류가 여전히 존재합니다.

는 여기에, 도움을주기 위해 BLOB에서 예제 데이터 :

HEX :

613A313A7B733A373A22636F6E74656E74223B733A3333333A223C70207374796C653D22746578742D616C69676E3A2063656E7465723B223E0A093C7370616E207374796C653D22636F6C6F723A20726762283235352C203235352C20323535293B223E3C7370616E207374796C653D22666F6E742D73697A653A20323470783B223E4672696C616E736F707064726167202D2042696C646561726B69763C2F7370616E3E3C2F7370616E3E3C2F703E0A3C70207374796C653D22746578742D616C69676E3A2063656E7465723B223E0A093C62723E0A093C7370616E207374796C653D22666F6E742D73697A653A20323070783B223E3C7370616E207374796C653D22636F6 C6F723A20726762283231312C203231312C20323131293B223E496E666F726D61736A6F6E202D20446F6B756D656E7461736A6F6E202D20507265737365202D20466F727374F87272656C7365723C2F7370616E3E3C2F7370616E3E3C2F703E0A223B7D

예상 값 : - Bildearkiv

Frilansoppdrag :이 예에서

a:1:{s:7:"content";s:333:"<p style="text-align: center;"> 
    <span style="color: rgb(255, 255, 255);"><span style="font-size: 24px;">Frilansoppdrag - Bildearkiv</span></span></p> 
<p style="text-align: center;"> 
    <br> 
    <span style="font-size: 20px;"><span style="color: rgb(211, 211, 211);">Informasjon - Dokumentasjon - Presse - Forstørrelser</span></span></p> 
";} 

, 나는 표시 다음 텍스트와 끝까지 정보 - 문서 - 프레젠테이션 - 추천 사용자

몇 가지 PHP 함수를 사용하면 데이터가 UTF8이고 내가 표시하는 페이지도 UTF8이라고 들었습니다. 그래서 약간의 혼란스러워서 왜 특수 문자에 대한 오류가 나옵니까? 또한 페이지 인코딩을 UTF-8에서 ISO-8859-15로 변경하면 문자가 잘 표시됩니다.

도움 주셔서 감사합니다.

+0

에서 벗어난 주제 측 질문 : 이유는 무엇인가 텍스트가 아니라 blob 필드에 텍스트를 저장하려면 (http://stackoverflow.com/questions/7071662/mysql-text-vs-blob-vs-clob 참조)? – reporter

+1

BLOB의 전체적인 점은 그것과 연관된 문자 집합이 없다는 것입니다. @reporter에 동의합니다 - ** charset이 필요하면 BLOB를 사용하는 것이 무엇입니까? 얼룩을 텍스트로 변환하고 문제를 해결하십시오. 그것이 당신이 올바르게하는 방법입니다. – Mjh

+0

@Mjh 텍스트에 대한 해협 데이터 유형 전환을 수행했으며 데이터 절반이 이제 잘립니다. 따라서 블롭에서 텍스트로 전환하는 것이 더 분명합니다. – David

답변

0

BLOB의 인코딩을 이해하지 않고 BLOB를 TEXT로 변환 할 수 없습니다. BLOB의 '텍스트'가 다양한 방식으로 인코딩되는 경우 일부 텍스트를 잃지 않고 텍스트로 변환 할 수 없습니다.

블롭의 HEX()을보세요. 예를 들어 é이고 16 진수가 E9 인 경우 은 latin1로 인코딩되었습니다. 대신에 C3A9을 얻는다면 utf8 (또는 utf8mb4)을 가지고있을 것입니다. 이 분석을 먼저 수행하지 않으면 BLOB의 "텍스트"가 파기되거나 (물음표로 바뀜) 위험 할 수 있습니다. 그러면 데이터를 잃게됩니다!

바꾼다 외모와 같은 :

ALTER TABLE t MODIFY c TEXT CHARACTER SET latin1 NOT NULL; -- if E9 
ALTER TABLE t MODIFY c TEXT CHARACTER SET utf8mb4 NOT NULL; -- if C3A9 

주의 :

  • 하여 백업을해야합니다; 무언가 잘못되면; 데이터가 손실 될 수 있습니다.
  • 표 및 열 이름을 tc으로 변경하십시오.
  • 현재 선언과 일치하도록 NULL 또는 NOT NULL을 추가하십시오.
  • 선언에있는 다른 모든 것을 앞으로 가져갑니다. (. 그리고 당신은 텍스트 해야한다고 생각 무엇을 포함)
  • 내 E9/C3A9 예 충분히 명확하지 않으면,의는 추가 논의에 대한 몇 가지 HEX를 보자
+0

'F9'는'ø'의 latin1 (또는 latin5 또는 dec8) 헥스입니다. 나는 당신이 마지막 단어가 Forstorrser 인 것을 기대하고 있다고 생각합니까? 그래서, 아마 첫 번째'ALTER'는 대략 필요한 것입니다. –