尝试将 MYSQL 的表字段类型从 BLOB 更改为 JSON

Posted

技术标签:

【中文标题】尝试将 MYSQL 的表字段类型从 BLOB 更改为 JSON【英文标题】:Trying To Change MYSQL's Table Field Type From BLOB to JSON 【发布时间】:2017-07-07 18:14:48 【问题描述】:

尝试为 mysql 数据库运行语句时,我不断收到错误消息。我想要做的是将列名的类型从 BLOB 更改为 JSON。

声明如下:

ALTER TABLE `main_db`.`main_table` 
CHANGE COLUMN `name` `name` JSON CHARACTER SET 'utf8mb4' NULL DEFAULT NULL ;

这是工作台自动为我创建的东西,当我运行它时...我收到此错误:

Operation failed: There was an error while applying the SQL script to the database.
Executing:
ALTER TABLE `main_db`.`main_table` 
CHANGE COLUMN `name` `name` JSON CHARACTER SET 'utf8mb4' NULL DEFAULT NULL ;

ERROR 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CHARACTER SET 'utf8mb4' NULL DEFAULT NULL' at line 2
SQL Statement:
ALTER TABLE `main_db`.`main_table` 
CHANGE COLUMN `name` `name` JSON CHARACTER SET 'utf8mb4' NULL DEFAULT NULL

任何帮助将不胜感激。

谢谢:)

【问题讨论】:

this SO 问题可能重复? 不,那没有回答我的问题。如果我从该答案运行语句,则会收到另一个错误:错误 3144:无法从具有 CHARACTER SET 'binary' 的字符串创建 JSON 值。 SQL 语句:ALTER TABLE main_db.main_table MODIFY name JSON 【参考方案1】:

尽量简化命令,去掉你不改变的部分:

ALTER TABLE `main_db`.`main_table` 
CHANGE COLUMN `name` `name` JSON;

【讨论】:

我试过了,问题是这个错误:错误 3144:无法从具有 CHARACTER SET 'binary' 的字符串创建 JSON 值。 SQL 语句:ALTER TABLE main_db.main_table CHANGE COLUMN name name JSON 听上去好像表格被填满了,现有数据无法转换。您可能必须创建一个新表,并编写一个查询来复制数据,并显式转换 JSON 数据。 你是最棒的。在我清理完桌子后它起作用了。谢谢 如何从 blob 显式转换为 json?我遇到了同样的错误无法从带有 CHARACTER SET 'binary' 的字符串创建 JSON 值。 @SathiyaVasagamS,请参阅下面大卫的回答。您可能需要分多个步骤来完成。【参考方案2】:

如何通过 TEXT 分两步将列转换为 JSON?

ALTER TABLE `main_db`.`main_table` MODIFY `name` TEXT;
ALTER TABLE `main_db`.`main_table` MODIFY `name` JSON;

使用MODIFY instead of CHANGE,因为您不需要重命名该列。

【讨论】:

【参考方案3】:

这就是我所做的,显式转换、删除旧列并重命名临时列:

alter table testjson add jdata json;
update testjson set jdata = cast(convert(cast(xdata as char(999999)) using utf8) as json);
alter table testjson drop column xdata;
alter table testjson change column jdata xdata json;

这里值得注意的是 LOAD..INFILE 中有一个相关的技巧:

LOAD DATA LOCAL INFILE "/tmp/another.csv" INTO TABLE another(@hid, @htype, @bindata) set id=unhex(@hid), type=unhex(@htype), jdata=cast(convert(cast(@bindata as char(999999)) using utf8) as json);

【讨论】:

【参考方案4】:

要获取现有数据,您需要创建一个新的 json 格式的临时列。 通过将 blob 列中的数据转换为字符串类型,将其复制到 temp 列中。

update main_db set temp = CAST(name AS CHAR(100000));

现在重命名两列,您将取回现有数据。

【讨论】:

以上是关于尝试将 MYSQL 的表字段类型从 BLOB 更改为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 使用客户端以及SELECT 方式查看 BLOB 类型字段内容总结

如何在 EF Code First 中声明具有 Medium Blob 数据类型的表上的字段

MySQL更改外键类型

Sqoop:导入所有转换 blob 类型的表

求助oracle高手,将varchar类型数据插入到blob类型字段中

mysql 垂直拆分