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
'programing' 카테고리의 다른 글
github 작업 - mysql에 연결할 수 없습니다. (0) | 2022.09.30 |
---|---|
카탈로그, 스키마, 사용자 및 데이터베이스 인스턴스 간의 관계 (0) | 2022.09.30 |
mySQL 서브쿼리 제한 (0) | 2022.09.30 |
Panda는 시리즈/데이터프레임 컬럼을 조건부 생성 (0) | 2022.09.30 |
뷰 라우터를 통해 로드된 컴포넌트에 Vue.js 스코프 스타일을 적용하는 방법 (0) | 2022.09.30 |