mysql存儲過程與json
1. 在Mysql資料庫中實現一個存儲過程,在這個存儲過程中,需要用游標,動態SQL,詳情點擊查看。。。
DECLAREstuNameVARCHAR(50);
DECLAREflagINT;
DECLAREupdate_cursorCURSOR
FOR
SELECTstu_nameFROMstudentWHEREid=id;
=1;
SETflag=0;
OPENupdate_cursor;
REPEAT/*循環*/
FETCHupdate_cursorINTOstuName;
SETjson=CONCAT(json,',',stuName);
UNTILflag
ENDREPEAT;
CLOSEupdate_cursor;
2. mysql和json有什麼區別和聯系
根本不是一回事,json是一種數據格式,而mysql是一個關系資料庫管理系統。二者沒有直接的關系。
3. mysql 中怎樣實現這樣需求的存儲過程
DECLARE stuName VARCHAR(50); DECLARE flag INT; DECLARE update_cursor CURSOR FOR SELECT stu_name FROM student WHERE id = id; DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag=1; SET flag=0; OPEN update_cursor; REPEAT /*循環*/ FETCH update_cursor INTO stuName; SET json = CONCAT(json,',',stuName); UNTIL flag END REPEAT; CLOSE update_cursor ;
4. MySQL怎麼寫存儲過程查詢某個表的某一條記錄,並把這條記錄的所有列名對應的值以json格式返回呢
給你個思路吧,既然你能問出這種問題應該是有了思路就會自己做的人,就不幫你寫代碼了。
首先,你確定這個表的所有欄位中沒有二進制內容,如果沒有的話,下面這個思路你可以試試,但是如果有的話估計就需要對二進制進行特別的處理了,如果你有的話再追問吧。
思路開始:
1.如果你是對一張確定的表(提前已經知道表結構)進行這樣的處理,那就查詢出來一條記錄,通過Mysql的字元串拼接函數CONCAT,按照JSON格式,慢慢的拼一個字元串,最後通過select這個字元串返回這個字元串就行了。
2.如果之前你並不知道,這個表的結構,甚至你根本不知道自己要處理的是那張表,那麼存儲過程中你需要傳遞一個表名進來,然後查詢information_schema資料庫中的COLUMNS表,從而獲得這個表的具體欄位信息,以及各個欄位的先後順序(為後面拼接字元串使用),剩下的就跟1中描述的思路一樣了。
雖然不知道你的用處是什麼,不過,以我個人的經驗,這種返回JSON的方式並不可取,這樣會增加資料庫的負擔,理論上應該是將數據出來後自己在程序中拼接。
5. mysql資料庫可以通過json存儲嗎
使用MySQL 5.5的半同步復制,可以大大降低數據丟失的風險。
MHA可以與半同步復制結合起來。
如果只有一個slave已經收到了最新的二進制日誌,MHA可以將最新的二進制日誌應用於其他所有的slave伺服器上,因此可以保證所有節點的數據一致性。
6. mysql使用什麼類型存 json數據
JSON (javaScriptObject Notation) 是一種輕量級的數據交換格式,主要用於傳送數據。JSON採用了獨立於語言的文本格式,類似XML,但是比XML簡單,易讀並且易編寫。對機器來說易於解析和生成,並且會減少網路帶寬的傳輸。由於JSON格式可以解耦javascript客戶端應用與Restful伺服器端的方法調用,因而在互聯網應用中被大量使用。
JSON的格式非常簡單:名稱/鍵值。之前MySQL版本裡面要實現這樣的存儲,要麼用VARCHAR要麼用TEXT大文本。 MySQL5.7發布後,專門設計了JSON數據類型以及關於這種類型的檢索以及其他函數解析。我們先看看MySQL老版本的JSON存取。
示例表結構:
CREATE TABLE json_test(
id INT,
person_desc TEXT
)ENGINE INNODB;
我們來插入一條記錄:
INSERT INTO json_test VALUES (1,'{
"programmers": [{
"firstName": "Brett",
"lastName": "McLaughlin",
"email": "aaaa"
}, {
"firstName": "Jason",
"lastName": "Hunter",
"email": "bbbb"
}, {
"firstName": "Elliotte",
"lastName": "Harold",
"email": "cccc"
}],
"authors": [{
"firstName": "Isaac",
"lastName": "Asimov",
"genre": "sciencefiction"
}, {
"firstName": "Tad",
"lastName": "Williams",
"genre":"fantasy"
}, {
"firstName": "Frank",
"lastName": "Peretti",
"genre": "christianfiction"
}],
"musicians": [{
"firstName": "Eric",
"lastName": "Clapton",
"instrument": "guitar"
}, {
"firstName": "Sergei",
"lastName": "Rachmaninoff",
"instrument": "piano"
}]
}');
那一般我們遇到這樣來存儲JSON格式的話,只能把這條記錄取出來交個應用程序,由應用程序來解析。如此一來,JSON又和特定的應用程序耦合在一起,其便利性的優勢大打折扣。
現在到了MySQL5.7,可以支持對JSON進行屬性的解析,我們重新修改下表結構:
ALTER TABLE json_test MODIFY person_desc json;
先看看插入的這行JSON數據有哪些KEY:
mysql> SELECT id,json_keys(person_desc) as "keys" FROM json_test\G
*************************** 1. row***************************
id: 1
keys: ["authors", "musicians","programmers"]
1 row in set (0.00 sec)
我們可以看到,裡面有三個KEY,分別為authors,musicians,programmers。那現在找一個KEY把對應的值拿出來:
mysql> SELECT json_extract(AUTHORS,'$.lastName[0]') AS 'name', AUTHORS FROM
-> (
-> SELECT id,json_extract(person_desc,'$.authors[0][0]') AS "authors" FROM json_test
->UNION ALL
-> SELECT id,json_extract(person_desc,'$.authors[1][0]') AS "authors" FROM json_test
-> UNION ALL
-> SELECT id,json_extract(person_desc,'$.authors[2][0]') AS "authors" FROM json_test
-> ) AS T1
-> ORDER BY NAME DESC\G
*************************** 1. row***************************
name:"Williams"
AUTHORS: {"genre": "fantasy","lastName": "Williams", "firstName":"Tad"}
*************************** 2. row***************************
name:"Peretti"
AUTHORS: {"genre":"christianfiction", "lastName": "Peretti","firstName": "Frank"}
*************************** 3. row***************************
name:"Asimov"
AUTHORS: {"genre": "sciencefiction","lastName": "Asimov", "firstName":"Isaac"}
3 rows in set (0.00 sec)
現在來把詳細的值羅列出來:
mysql> SELECT
->json_extract(AUTHORS,'$.firstName[0]') AS "firstname",
-> json_extract(AUTHORS,'$.lastName[0]')AS "lastname",
-> json_extract(AUTHORS,'$.genre[0]') AS"genre"
-> FROM
-> (
-> SELECT id,json_extract(person_desc,'$.authors[0]')AS "authors" FROM json
_test
-> ) AS T\G
*************************** 1. row***************************
firstname: "Isaac"
lastname:"Asimov"
genre:"sciencefiction"
1 row in set (0.00 sec)
我們進一步來演示把authors 這個KEY對應的所有對象刪掉。
mysql> UPDATE json_test
-> SET person_desc =json_remove(person_desc,'$.authors')\G
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
查找下對應的KEY,發現已經被刪除掉了。
mysql> SELECT json_contains_path(person_desc,'all','$.authors')as authors_exists FROM json_test\G
*************************** 1. row***************************
authors_exists: 0
1 row in set (0.00 sec)
總結下,雖然MySQL5.7開始支持JSON數據類型,但是我建議如果要使用的話,最好是把這樣的值取出來,然後在應用程序段來計算。畢竟資料庫是用來處理結構化數據的,大量的未預先定義schema的json解析,會拖累資料庫的性能。
7. 如果將json格式數據存儲到類似mysql這樣的關系型資料庫中,怎麼查
在MySQL與PostgreSQL的對比中,PG的JSON格式支持優勢總是不斷被拿來比較。其實早先MariaDB也有對非結構化的數據進行存儲的方案,稱為dynamic column,但是方案是通過BLOB類型的方式來存儲。這樣導致的問題是查詢性能不高,不能有效建立索引,與一些文檔資料庫對比,優勢並不大,故在社區的反應其實比較一般。當然,MariaDB的dynamic column功能還不僅限於非結構化數據的存儲,但不在本文進行展開。
MySQL 5.7.7 labs版本開始InnoDB存儲引擎已經原生支持JSON格式,該格式不是簡單的BLOB類似的替換。原生的JSON格式支持有以下的優勢:
JSON數據有效性檢查:BLOB類型無法在資料庫層做這樣的約束性檢查
查詢性能的提升:查詢不需要遍歷所有字元串才能找到數據
支持索引:通過虛擬列的功能可以對JSON中的部分數據進行索引
首先我們來看如何在MySQL中使用原生的JSON格式:
mysql> create table user ( uid int auto_increment,
-> data json,primary key(uid))engine=innodb;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into user values (NULL,
-> '{"name":"David","mail":"[email protected]","address":"Shangahai"}');
Query OK, 1 row affected (0.00 sec)
mysql> insert into user values (NULL,'{"name":"Amy","mail":"[email protected]"}');
Query OK, 1 row affected (0.00 sec)
可以看到我們新建了表user,並且將列data定義為了JSON類型。這意味著我們可以對插入的數據做JSON格式檢查,確保其符合JSON格式的約束,如插入一條不合法的JSON數據會報如下錯誤:
mysql> insert into user values (NULL,"test");
ERROR 3130 (22032): Invalid JSON text: "Invalid value" at position 2 in value (or column) 'test'.
此外,正如前面所說的,MySQL 5.7提供了一系列函數來高效地處理JSON字元,而不是需要遍歷所有字元來查找,這不得不說是對MariaDB dynamic column的巨大改進:
mysql> select jsn_extract(data, '$.name'),jsn_extract(data,'$.address') from user;
+-----------------------------+-------------------------------+
| jsn_extract(data, '$.name') | jsn_extract(data,'$.address') |
+-----------------------------+-------------------------------+
| "David" | "Shangahai" |
| "Amy" | NULL |
+-----------------------------+-------------------------------+
2 rows in set (0.00 sec)
當然,最令人的激動的功能應該是MySQL 5.7的虛擬列功能,通過傳統的B+樹索引即可實現對JSON格式部分屬性的快速查詢。使用方法是首先創建該虛擬列,然後在該虛擬列上創建索引:
mysql> ALTER TABLE user ADD user_name varchar(128)
-> GENERATED ALWAYS AS (jsn_extract(data,'$.name')) VIRTUAL;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select user_name from user;
+-----------+
| user_name |
+-----------+
| "Amy" |
| "David" |
+-----------+
2 rows in set (0.00 sec)
mysql> alter table user add index idx_username (user_name);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
然後可以通過添加的索引對用戶名進行快速的查詢,這和普通類型的列查詢一樣。而通過explain可以驗證優化器已經選擇了在虛擬列上創建的新索引:
mysql> explain select * from user where user_name='"Amy"'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: ref
possible_keys: idx_username
key: idx_username
key_len: 131
ref: const
rows: 1
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)
可以發現MySQL 5.7對於JSON格式堪稱完美,相信PostgreSQL陣營需要尋找新的策略來「攻擊」MySQL了吧。如無意外,還是會停留在優化器這塊,畢竟這塊是目前MySQL必須要克服的最大問題,好在MySQL團隊已經在重構優化器代碼,相信更好的優化器將會在下一個版本中全面爆發。而一大堆文檔資料庫們已經哭暈在廁所了吧。
8. mysql存儲過程處理json格式內容
找MYSQL JSON UDF吧,原生並沒有JSON解碼支持
9. mysql 存json串的過程會丟失部分為什麼
JSON的格式非常簡單:名稱/鍵值。之前MySQL版本裡面要實現這樣的存儲,要麼用VARCHAR要麼用TEXT大文本。 MySQL5.7發布後,專門設計了JSON數據類型以及關於這種類型的檢索以及其他函數解析。我們先看看MySQL老版本的JSON存取。
示例表結構:
CREATE TABLE json_test(
id INT,
person_desc TEXT
)ENGINE INNODB;
我們來插入一條記錄:
INSERT INTO json_test VALUES (1,'{
"programmers": [{
"firstName": "Brett",
"lastName": "McLaughlin",
"email": "aaaa"
}, {
"firstName": "Jason",
"lastName": "Hunter",
"email": "bbbb"
}, {
"firstName": "Elliotte",
"lastName": "Harold",
"email": "cccc"
}],
10. mysql資料庫中某個欄位存的是json數據,如何對json數據中的數據進行操作
這個可以吧json格式的字元串解析成數組json_decode()函數,變成數組以後就可以方便操作了,可以刪除數組中的任意一項,也可以增加一項比如:array_push($data,['sort'=>3,'catentryId'=>10003]),再變成json格式的存入資料庫。方法有多種,這里簡單的示例下