programing

MySQL 5.7.12 가져오기에서는 CHARTER SET 'binary' 문자열에서 JSON 값을 생성할 수 없습니다.

nicescript 2022. 9. 30. 12:17
반응형

MySQL 5.7.12 가져오기에서는 CHARTER SET 'binary' 문자열에서 JSON 값을 생성할 수 없습니다.

JSON 열이 있는 데이터베이스를 내보냈습니다.새로운 서버로 이행한 후 Import가 매번 크래시되어 다음과 같은 오류가 발생하였습니다.

CHARTER SET 'binary' 문자열에서 JSON 값을 생성할 수 없습니다.

stackoverflow에서 이 게시물을 찾았지만 작동하지 않았습니다.mysqlimport는 json 값을 로드할 수 없는 "set @@character_set_set=set"을 발행합니다.

파일이 2GB이므로 파일을 열 수 없습니다.

내 데이터베이스 파일을 가져올 아이디어 있는 사람?

내보낸 SQL 텍스트에 정규식을 적용하여 이진 문자열을 삽입 가능한 형식으로 변환할 수 있습니다.이 문제에 직면했을 때 이것은 나의 빠르고 더러운 수정이었다.

(X'[^,\)]*')
CONVERT($1 using utf8mb4)

이 regex를 적용하면

INSERT INTO json_table (json_column) VALUES (X'7B22666F6F223A2022626172227D');

이제 된다

INSERT INTO json_table (json_column) VALUES (CONVERT(X'7B22666F6F223A2022626172227D' using utf8mb4));

Sequel Pro의 수출과 관련하여 문제가 있었습니다.체크박스를 꺼서Output BLOB fields as hex옵션과 문제는 사라졌습니다.육안으로 수출을 검사한 결과 바이너리가 아닌 판독 가능한 JSON이 나타났습니다.

저도 오늘 같은 문제에 직면했어요.다음은 제 사례에 대한 조사 결과입니다.

친구에게 Import할 SQL 덤프를 생성해 달라고 부탁했습니다.그는 사용했다sequel-pro덤프를 생성합니다(데이터베이스 내보내기).Import 했을 때 에러가 발생하였습니다.

Cannot create a JSON value from a string with CHARACTER SET 'binary'

생성된 덤프에 문제가 있어서json필드가 값이 아닌 원시 형식으로 변환되었습니다.

"{'key1':'value1', 'key2':'value2'}"

그랬다.

X'nfdsklsdsklnfjkbvkjsdbvkjhdfsbvkjdsbnvljkdsbvkjhdfbvkjdfbvjkdfb'

따라서 덤프를 Import할 때, 즉,insert진술들mysql데이터가 없었기 때문에 데이터를 처리할 수 없었다json유형.

다음은 보고된 버그에 대한 링크입니다.
https://github.com/sequelpro/sequelpro/issues/2397

이 체크박스를 꺼야 합니다.Output BLOB fields as hex선택.

vim version Lorcan O'Neill의 답변은 다음과 같습니다.

vi xxxx.sql
:%s/\(X'[^,\)]*'\)/CONVERT(\1 using utf8mb4)/g

이것은 나에게도 효과가 있었습니다(SQL 파일로의 export도 제어할 수 있었습니다).예를 들어, 많은 주의사항이 있습니다.필드는 1000을 넘지 않으며 ASCII가 아닌 문자를 포함할 수 없다는 것을 알고 있었습니다.코멘트를 해 주세요.왜 이렇게 안 좋은지 알려주세요:)

내보내기 전

alter table <table> modify <json_column> varchar(1000);

Import 후

alter table <table> modify <json_column> json;

2019년 6월 경에 Sequel Pro를 사용하고 계신 분은, 「Output BLOB fields as hex option」(상기)을 오프하는 것 외에, 2년 전에 JSON 타입의 서포트를 추가한 나이트 빌드를 사용할 필요가 있습니다.이 지원은 아직 정식 발매에 이르지 못했습니다.

덤프에 문제가 있었습니다.덤프 파일의 행을 다음과 같이 변경하여 해결할 수 있었습니다.

/*!40101 SET NAMES binary*/;

로.

/*!40101 SET NAMES utf8mb4*/;

Lorcan의 답변은 처음에는 도움이 되었지만, 모든 바이너리 값을 변환하면 다음과 같은 많은 오류 메시지가 생성되었습니다.Duplicate entry [...] for key 'PRIMARY' 또는7D로 엔트리가 5B로 하는 것을 합니다.이것은 당연히 JSON 엔트리는 5B 또는 7D로 시작한다는 것을 의미합니다.[ ★★★★★★★★★★★★★★★★★」{으로 with으 and and and and and로 ] ★★★★★★★★★★★★★★★★★」}따라서 이러한 엔트리만 regex로 치환하는 것이 효과적이었습니다.

Find:    (X'5B[^,\)]*5D')
Replace: CONVERT($1 using utf8mb4)

그리고나서

Find:    (X'7B[^,\)]*7D')
Replace: CONVERT($1 using utf8mb4)

Et voila, 모든 가져오기 오류는 사라졌습니다! (적어도 내 경우)

대조 결과를 utf8_general_ci로 변경해 주세요.

Symfony 4 / 독트린 : 어떤 이유로 JSON을 저장하는 롱텍스트 MySQL 타입이나 json을 저장하는 json MySQL 타입으로 같은 엔티티를 해결할 수 있습니다.Longtext MySQL type을 수동으로 설정하면 문제가 해결되었습니다.

단순한 UPDATE 쿼리를 실행할 때 다음과 같은 이상한 문제가 발생했습니다.

update some_table set json_attr = '{"test":168}' where id = 123456;

MySQL을 재시작하면 수정되었습니다.원인을 정확히 알아낼 수 없었다.

편집: Aurora를 사용하고 있습니다.같은 인스턴스에서 마스터 접속과 슬레이브 접속/리더 접속을 모두 처리하는 이상한 설정이 있었던 것과 관련이 있는 것 같습니다.

모든 MySQL JSON 데이터 형식 정보는 이진수가 아닌 UTF8MB4 문자 집합이어야 합니다.

언급URL : https://stackoverflow.com/questions/38078119/mysql-5-7-12-import-cannot-create-a-json-value-from-a-string-with-character-set

반응형