>  기사  >  백엔드 개발  >  emoji - thinkphp mysql 지정된 문자 인코딩을 사용하여 지정된 테이블을 쿼리하고 작동하는 방법은 무엇입니까?

emoji - thinkphp mysql 지정된 문자 인코딩을 사용하여 지정된 테이블을 쿼리하고 작동하는 방법은 무엇입니까?

WBOY
WBOY원래의
2016-08-10 09:07:141167검색

문제는 이것이다:
많은 테이블과 많은 기존 데이터가 있는 데이터베이스가 있습니다. 이러한 데이터의 대부분은 utf8에 저장됩니다(전부는 아니지만 latin1도 있습니다).
사용자가 이모티콘을 저장하지 못하는 문제가 발생했습니다. 올바른 저장을 위해서는 utf8mb4가 필요한 것으로 알려져 있습니다.

Mysql이 5.1에서 5.6.26으로 업그레이드되었습니다. 다음 생각과 기존 시도:
1. 전체 데이터베이스를 uft8mb4로 업데이트하면 위험이 너무 큽니다. 다양한 호출 위치가 지저분하고 유지 관리가 제대로 되지 않기 때문입니다. utf8mb4로 직접 변경하면 전체 시스템이 작동하지 않을 수 있습니다. 평범해지세요.

2. 사용자가 이모티콘을 저장하는 테이블(이하 테이블 E)만 uft8mb4로 업데이트하는 것을 고려해보세요. 단, 여기의 시스템은 thinkphp로 작성되었으며 인코딩 설정은 config에 있습니다. php , 이것을 수정하면 thinkphp가 완전히 파괴됩니다.

3. 2를 고려하면 thinkphp의 본체는 여전히 uft8을 변경 없이 사용하고 이 테이블 E를 쿼리할 때 일시적으로만 uft8mb4를 사용합니다. M()->query('SET NAMES 'utf8mb4'');을 시도하면 오류가 발생합니다: SQLSTATE[HY000]: General error

4. 방법 2를 계속 고려하고 있지만 작동하지 않는 것으로 나타났습니다. 왜냐하면 이 테이블 E를 성공적으로 쿼리한 후에도 다른 테이블에 대한 작업이 수행되고 uft8mb4는 후속 쿼리에서 오류를 일으킬 수 있기 때문입니다.

다른 테이블의 작업에 영향을 주지 않고 이 테이블에서만 utf8mb4 인코딩 작업을 수행할 수 있는 좋은 방법이 있습니까?

PS: 제작 환경이 1년 동안 온라인 상태였고 데이터와 온라인 사용자가 많기 때문에 이 문제는 현재 테스트에서만 보고되었습니다. 전체 데이터베이스의 코딩을 업데이트하는 것은 너무 위험합니다. 리더의 생각은 함정을 먼저 채우고, 발견되지 않은 함정은 보지 못한 척하는 것입니다.
다행히 시스템을 구축할 때 프로덕션 환경을 설치했는데, mysql은 처음부터 최신 버전인 5.6.26이었습니다. 이모티콘을 다시 코딩하는 방법이 최후의 수단으로만 사용되기를 바랍니다.

답글 내용:

문제는 이것이다:
많은 테이블과 많은 기존 데이터가 있는 데이터베이스가 있습니다. 이러한 데이터의 대부분은 utf8에 저장됩니다(전부는 아니지만 latin1도 있습니다).
사용자가 이모티콘을 저장하지 못하는 문제가 발생했습니다. 올바른 저장을 위해서는 utf8mb4가 필요한 것으로 알려져 있습니다.

MySQL이 5.1에서 5.6.26으로 업그레이드되었습니다. 다음 생각과 기존 시도:
1. 전체 데이터베이스를 uft8mb4로 업데이트하면 위험이 너무 큽니다. 다양한 호출 위치가 지저분하고 유지 관리가 제대로 되지 않기 때문입니다. utf8mb4로 직접 변경하면 전체 시스템이 작동하지 않을 수 있습니다. 평범해지세요.

2. 사용자가 이모티콘을 저장하는 테이블(이하 테이블 E)만 uft8mb4로 업데이트하는 것을 고려해보세요. 단, 여기의 시스템은 thinkphp로 작성되었으며 인코딩 설정은 config에 있습니다. php , 이것을 수정하면 thinkphp가 완전히 파괴됩니다.

3. 2를 고려하면 thinkphp의 본체는 여전히 uft8을 변경 없이 사용하고 이 테이블 E를 쿼리할 때 일시적으로만 uft8mb4를 사용합니다. M()->query('SET NAMES 'utf8mb4'');을 시도하면 오류가 발생합니다: SQLSTATE[HY000]: General error

4. 여전히 방법 2를 고려하고 있지만 작동하지 않는 것으로 확인되었습니다. 왜냐하면 이 테이블 E를 성공적으로 쿼리한 후에도 다른 테이블에 대한 작업이 수행되고 uft8mb4는 후속 쿼리에서 오류를 일으킬 수 있기 때문입니다.

다른 테이블의 작업에 영향을 주지 않고 이 테이블에서만 utf8mb4 인코딩 작업을 수행할 수 있는 좋은 방법이 있습니까?

PS: 제작 환경이 1년 동안 온라인 상태였고 데이터와 온라인 사용자가 많기 때문에 이 문제는 현재 테스트에서만 보고되었습니다. 전체 데이터베이스의 코딩을 업데이트하는 것은 너무 위험합니다. 리더의 생각은 함정을 먼저 채우고, 발견되지 않은 함정은 보지 못한 척하는 것입니다.
다행히 시스템을 구축할 때 프로덕션 환경을 설치했는데, 초기에는 mysql이 최신 버전인 5.6.26이었습니다. 이모티콘을 다시 코딩하는 방법이 최후의 수단으로만 사용되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.