## 1. 背景 `VARBINARY` 存储变长二进制数据,跨库复制时若处理不当,易导致数据损坏,应用解析失败。 --- ## 2. 常见问题 - 手动复制变成乱码或不完整 - 应用读取报错 - 导出/导入方式不当导致迁移失败 --- ## 3. 正确做法(十六进制方式) - **导出数据:** ```sql SELECT HEX(binary_column) FROM your_table WHERE id = 123; ``` - **导入数据:** ```sql UPDATE your_table SET binary_column = UNHEX('十六进制字符串') WHERE id = 123; ``` - **生成插入语句:** ```sql SELECT CONCAT( 'INSERT INTO your_table (id, binary_column) VALUES (', id, ", UNHEX('", HEX(binary_column), "'));" ) FROM your_table WHERE id = 123; ``` --- ## 4. 使用 JPA + Spring Boot 的字段类型建议 ### 推荐 - **文本/JSON 数据**:使用 `String` 或 `Map`,并指定 `@Column(columnDefinition = "json")` 或使用 `@Convert` 自定义序列化。 - **二进制数据**:使用 `byte[]`,避免使用对象序列化。 ### 避免 - 避免直接使用 `JSONObject` 类型。JPA 无法识别,会自动序列化为 Java 对象字节流,生成 `VARBINARY` 字段,内容不可读、不可移植。 --- ## 5. 常见疑问 ### Q1:为什么使用 `JSONObject` 会映射为 `VARBINARY`? 因为 JPA 不知道如何映射 `JSONObject` 类型,会使用 Java 默认序列化方式,将其序列化为字节流,对应数据库字段类型为 `VARBINARY` 或 `BLOB`。这种数据不可读,也不具备通用性。 --- ### Q2:我想存 JSON 数据,用 `String` 字段可以吗? 可以,**推荐**使用 `String` 或 `Map`,配合 `@Column(columnDefinition = "json")` 或使用 Hibernate 的 `@Type(type = "json")`。这样 JPA 会把它当作文本处理,数据库也能直接识别为 JSON 类型。 ## 6. 建议 - 结构化数据建议统一使用 JSON 字符串存储。 - 二进制数据使用十六进制方式导出/导入。 - 避免手动复制二进制内容,推荐脚本化处理。 --- ## 7. 总结 跨库复制 `VARBINARY` 要确保编码/还原正确;JPA 中避免使用 `JSONObject` 等非标准类型,JSON 数据建议显式映射为文本,确保可读性、可迁移性、可维护性。 Loading... ## 1. 背景 `VARBINARY` 存储变长二进制数据,跨库复制时若处理不当,易导致数据损坏,应用解析失败。 --- ## 2. 常见问题 - 手动复制变成乱码或不完整 - 应用读取报错 - 导出/导入方式不当导致迁移失败 --- ## 3. 正确做法(十六进制方式) - **导出数据:** ```sql SELECT HEX(binary_column) FROM your_table WHERE id = 123; ``` - **导入数据:** ```sql UPDATE your_table SET binary_column = UNHEX('十六进制字符串') WHERE id = 123; ``` - **生成插入语句:** ```sql SELECT CONCAT( 'INSERT INTO your_table (id, binary_column) VALUES (', id, ", UNHEX('", HEX(binary_column), "'));" ) FROM your_table WHERE id = 123; ``` --- ## 4. 使用 JPA + Spring Boot 的字段类型建议 ### 推荐 - **文本/JSON 数据**:使用 `String` 或 `Map`,并指定 `@Column(columnDefinition = "json")` 或使用 `@Convert` 自定义序列化。 - **二进制数据**:使用 `byte[]`,避免使用对象序列化。 ### 避免 - 避免直接使用 `JSONObject` 类型。JPA 无法识别,会自动序列化为 Java 对象字节流,生成 `VARBINARY` 字段,内容不可读、不可移植。 --- ## 5. 常见疑问 ### Q1:为什么使用 `JSONObject` 会映射为 `VARBINARY`? 因为 JPA 不知道如何映射 `JSONObject` 类型,会使用 Java 默认序列化方式,将其序列化为字节流,对应数据库字段类型为 `VARBINARY` 或 `BLOB`。这种数据不可读,也不具备通用性。 --- ### Q2:我想存 JSON 数据,用 `String` 字段可以吗? 可以,**推荐**使用 `String` 或 `Map<String, Object>`,配合 `@Column(columnDefinition = "json")` 或使用 Hibernate 的 `@Type(type = "json")`。这样 JPA 会把它当作文本处理,数据库也能直接识别为 JSON 类型。 ## 6. 建议 - 结构化数据建议统一使用 JSON 字符串存储。 - 二进制数据使用十六进制方式导出/导入。 - 避免手动复制二进制内容,推荐脚本化处理。 --- ## 7. 总结 跨库复制 `VARBINARY` 要确保编码/还原正确;JPA 中避免使用 `JSONObject` 等非标准类型,JSON 数据建议显式映射为文本,确保可读性、可迁移性、可维护性。 最后修改:2025 年 06 月 23 日 © 允许规范转载 赞 1 别打赏,我怕忍不住购买辣条与续命水