尝试将 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 TABLEmain_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 TABLEmain_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 数据类型的表上的字段