当前位置: 首页 > 科技观察

MySQLJSON数据类型是如何操作的?在这里告诉大家~

时间:2023-03-12 11:31:20 科技观察

概述Mysql从5.7.8版本开始支持json结构的数据存储和查询,可见mysql也在不断学习和增加nosql数据库的优点。但是mysql毕竟是关系型数据库,在处理json这样的非结构化数据的时候还是比较笨拙的。要创建一个带有JSON字段的表,首先创建一个包含json格式字段的表:CREATETABLEtable_name(idINTNOTNULLAUTO_INCREMENT,json_colJSON,PRIMARYKEY(id));上面语句主要关注字段json_col,指定数据类型为JSON。插入一个简单的JSON数据INSERTINTTOtable_name(json_col)VALUES('{"City":"Galle","Description":"Bestdamncityintheworld"}');上面的SQL语句主要关注VALUES后面的部分,因为json格式的数据中,需要用双引号来标识字符串,所以VALUES后面的内容需要用单引号包裹起来。插入一段复杂的JSON数据INSERTINTTOtable(col)VALUES('{"opening":"Sicilian","variations":["pelikan","dragon","najdorf"]}');在这里,我们插入了一个json数组。主要是要注意单引号和双引号的问题。在前面修改JSON数据的例子中,我们插入了好几条JSON数据,但是如果我们想修改JSON数据中的东西,怎么实现呢?例如,如果我们向variations数组添加一个元素,可以这样进行:UPDATEmyjsonSETdict=JSON_ARRAY_APPEND(dict,'$.variations','scheveningen')WHEREid=2;在此SQL语句中,$符号表示JSON字段,通过.number,然后通过JSON_ARRAY_APPEND函数添加一个元素。现在我们执行查询语句:SELECT*FROMmyjson结果为:+----+------------------------------------------------------------------------------------+|id|dict|+---+-----------------------------------------------------------------------------------+|2|{"opening":"Sicilian","variations":["pelikan","dragon","najdorf","scheveningen"]}|+----+------------------------------------------------------------------------------------MySQL上+1rowinset(0.00sec),获取JSON的方法数据,参考官方链接JSONPathSyntax创建索引MySQL的JSON格式的数据不能直接索引,但是可以变通,将要查找的数据单独提取出来,使用单个数据列,然后key上这个字段索引。下面是官方的例子:mysql>CREATETABLEjemp(->cJSON,->gINTGENERATEDALWAYSAS(c->"$.id"),->INDEXi(g)->);QueryOK,0rowsaffected(0.28sec)mysql>INSERTINTOjemp(c)VALUES>('{"id":"1","name":"Fred"}'),('{"id":"2","name":"Wilma"}'),>('{"id":"3","name":"Barney"}'),('{"id":"4","name":"Betty"}');QueryOK,4rowsaffected(0.04sec)条记录:4Duplicates:0Warnings:0mysql>SELECTc->>"$.name"ASname>FROMjempWHEREg>2;+--------+|name|+--------+|Barney||Betty|+--------+2rowsinset(0.00sec)mysql>EXPLAINSELECTc->>"$.name"ASname>FROMjempWHEREg>2\G*****************************1.row***************************id:1select_type:SIMPLEtable:jemppartitions:NULLtype:rangepossible_keys:ikey:ikey_len:5ref:NULLrows:2filtered:100.00额外:Usingwhere1rowinset,1warning(0.00sec)mysql>SHOWWARNINGS\G***************************1.row***************************Level:NoteCode:1003Message:/*select#1*/selectjson_unquote(json_extract(`test`.`jemp`.`c`,'$.name'))AS`name`from`test`.`jemp`where(`test`.`jemp`.`g`>2)1rowinset(0.00sec)这个例子很简单,就是id中的JSONfield将字段单独提取到字段g中,然后在字段g上建立索引,查询条件也是在字段g上字符串转换JSON格式把json格式的字符串转换成MySQL的JSON类型:SELECTCAST('[1,2,3]'asJSON);SELECTCAST('{"opening":"Sicilian","variations":["pelikan","dragon","najdorf"]}'asJSON);所有MYSQLJSON函数NameDescriptionJSON_APPEND()AppenddatatoJSONdocumentJSON_ARRAY()CreateJSONarrayJSON_ARRAY_APPEND()AppenddatatoJSONdocumentJSON_ARRAY_INSERT()InsertintoJSONarray->ReturnvaluefromJSONcolumnafterevaluatingpath;equivalenttoJSON_EXTRACT().JSON_CONTAINS()WhetherJSONdocumentcontainsspecificobjectatpathJSON_CONTAINS_PATH()WhetherJSONdocumentcontainsanydataatpathJSON_DEPTH()MaximumdepthofJSONdocumentJSON_EXTRACT()ReturndatafromJSONdocument->>ReturnvaluefromJSONcolumnafterevaluatingpathandunquotingtheresult;equivalenttoJSON_UNQUOTE(JSON_EXTRACT()).JSON_INSERT()InsertdataintoJSONdocumentJSON_KEYS()ArrayofkeysfromJSONdocumentJSON_LENGTH()NumberofelementsinJSONdocumentJSON_MERGE()MergeJSONdocuments,preservingduplicatekeys.DeprecatedsynonymforJSON_MERGE_PRESERVE()JSON_MERGE_PRESERVE()MergeJSONdocuments,preservingduplicatekeysJSON_OBJECT()CreateJSONobjectJSON_QUOTE()QuoteJSONdocumentJSON_REMOVE()RemovedatafromJSONdocumentJSON_REPLACE()ReplacevaluesinJSONdocumentJSON_SEARCH()PathtovaluewithinJSONdocumentJSON_SET()InsertdataintoJSONdocumentJSON_TYPE()TypeofJSONvalueJSON_UNQUOTE()UnquoteJSONvalueJSON_VALID()WhetherJSONvalueisvalid