自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

在MySQL中使用XML數(shù)據(jù)—數(shù)據(jù)格式化

數(shù)據(jù)庫 MySQL
MySQL是一個(gè)小型關(guān)系型數(shù)據(jù)庫管理系統(tǒng),MySQL規(guī)模小、功能有限(MySQL Cluster的功能和效率都相對比較差)等,盡管MySQL存在這些缺點(diǎn),可是依舊很受歡迎。在MySQL中使用XML數(shù)據(jù)就是將數(shù)據(jù)進(jìn)行格式化。下面來介紹這項(xiàng)技術(shù)。

前沿:MySQL中使用XML數(shù)據(jù)可以更好的管理數(shù)據(jù),將所有數(shù)據(jù)進(jìn)行了格式化,這個(gè)過程是怎么樣的呢?

在存儲過程中使用ExtractValue()函數(shù)

  上面使用的方法***的缺陷就是在代碼中寫死了要檢索的行,這樣很不靈活,下面我們使用一個(gè)存儲過程來解決這個(gè)問題。

  MySqlDump

  有Igor Romanenko編寫的MySqlDump客戶端最初是一個(gè)備份程序,它可以備份數(shù)據(jù)庫,或?qū)⒁粋€(gè)數(shù)據(jù)庫轉(zhuǎn)移到另一個(gè)數(shù)據(jù)庫(MySQL或其它數(shù)據(jù)庫),它的這個(gè)備份過程其實(shí)是一個(gè)創(chuàng)建表,填充表的過程。此外,MySqlDump還可以生成CSV,XML或其它由分隔符控制的文本文件。

  雖然不止一種執(zhí)行MySqlDump的方法,但我想使用下面的語法:

  1. mysqldump --xmldatabasename[tables] 

  你也可以使用標(biāo)準(zhǔn)的Unix/Dos方法輸出到一個(gè)文件,如下面的命令將一個(gè)表轉(zhuǎn)成一個(gè)XML文件: 

  1. C:\>mysqldump --xml temp_table_article client > c:\\sqldump.xml 

 

  打開sqldump.xml看看,我們發(fā)現(xiàn)MySqlDump客戶端包括了比--xml選項(xiàng)更多的信息,但它卻是按每一行、字段名和值的方式輸出的,MySqlDump將表結(jié)構(gòu)和表數(shù)據(jù)單獨(dú)輸出。

  1. <?xml version=1.0?
  2. <mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
  3. <database name="temp_table_article">  
  4. name="client">  
  5. client_id Type=int(10)unsignedNull=NO"Key=PRI" Extra=auto_increment/>
  6. Field="date_of_birth" Type="date" Null="YES" Key="" Extra="" />  
  7.                  <field Field="gender" Type="char(1)" Null="YES" Key="" Extra="" />  
  8.                  <field Field="logical_delete_indicator" Type="tinyint(1)" Null="NO" Key="" Default="0" Extra="" />  
  9.                  <key Table="client" Non_unique="0" Key_name="PRIMARY" Seq_in_index="1" Column_name="client_id"   
  10.                    Collation="A" Cardinality="4" Null="" Index_type="BTREE" Comment="" />  
  11.                  <key Table="client" Non_unique="0" Key_name="client_id" Seq_in_index="1" Column_name="client_id"   
  12.                    Collation="A" Cardinality="4" Null="" Index_type="BTREE" Comment="" />  
  13.                  <options Name="client" Engine="InnoDB" Version="10" Row_format="Compact" Rows="4" Avg_row_length="4096"   
  14.                    Data_length="16384" Max_data_length="0" Index_length="16384" Data_free="10485760"   
  15.                    Auto_increment="5"   
  16.                    Create_time="2009-10-05 17:51:34" Collation="latin1_swedish_ci" Create_options=""   
  17.                    Comment="" />  
  18.          </table_structure>  
  19.          <table_data name="client">  
  20.          <row>  
  21.                  <field name="client_id">1</field>  
  22.                  <field name="date_of_birth">1976-02-12</field>  
  23.                  <field name="gender">M</field>  
  24.                  <field name="logical_delete_indicator">1</field>  
  25.          </row>  
  26.          <row>  
  27.                  <field name="client_id">2</field>  
  28.                  <field name="date_of_birth">1944-01-15</field>  
  29.                  <field name="gender">F</field>  
  30.                  <field name="logical_delete_indicator">0</field>  
  31.          </row>  
  32.          <row>  
  33.                  <field name="client_id">3</field>  
  34.                  <field name="date_of_birth">1956-06-04</field>  
  35.                  <field name="gender">M</field>  
  36.                  <field name="logical_delete_indicator">1</field>  
  37.          </row>  
  38.          <row>  
  39.                  <field name="client_id">4</field>  
  40.                  <field name="date_of_birth">1938-11-19</field>  
  41.                  <field name="gender">F</field>  
  42.                  <field name="logical_delete_indicator">0</field>  
  43.          </row>  
  44.          </table_data>  
  45. </database>  
  46. </mysqldump> 

  我們使用這個(gè)工具創(chuàng)建XML數(shù)據(jù)結(jié)構(gòu)的原因是已經(jīng)有存儲過程可以將MySqlDump XML數(shù)據(jù)插入到表中,MySQL開發(fā)人員Alexander Barkov編寫了這樣一個(gè)存儲過程xmldump_load,這個(gè)存儲過程可以從mysqldump --xml命令輸出的XML文檔中提取數(shù)據(jù),并將提取到的數(shù)據(jù)插入到MySQL表的列中,下面是這個(gè)存儲過程的全部代碼。

 

  1. DELIMITER |  
  2. DROP PROCEDURE IF EXISTS xmldump_load |  
  3. CREATE PROCEDURE xmldump_load(     file_name VARCHAR(128),  
  4.                           database_name VARCHAR(128),  
  5.                           table_name VARCHAR(128))  
  6. BEGIN 
  7.   DECLARE xml TEXT;  
  8.    DECLARE nrows INT;  
  9.   DECLARE rownum INT DEFAULT 1;  
  10.    DECLARE ncols INT;  
  11.   DECLARE colnum INT DEFAULT 1;  
  12.    DECLARE ins_list TEXT DEFAULT '';  
  13.   DECLARE val_list TEXT DEFAULT '';  
  14.    DECLARE tmp VARCHAR(255);  
  15.    # 將XML文件的內(nèi)容載入到字符串中  
  16.   SET xml = LOAD_FILE(file_name);  
  17.    # 獲得這個(gè)表中<row>的數(shù)量  
  18.   SET nrows = ExtractValue(xml,   
  19.    'count(/mysqldump/database[@name=$database_name]/table_data[@name=$table_name]/row)');  
  20.    # 獲得這個(gè)表中<filed>的數(shù)量  
  21.   SET ncols = ExtractValue(xml,   
  22. 'count(/mysqldump/database[@name=$database_name]/table_data[@name=$table_name]/row[1]/field)');  
  23.    # 對于每一個(gè) <row>  
  24.   WHILE rownum <= nrows DO  
  25.     # 對于每一個(gè) <field> (列)  
  26.     WHILE colnum <= ncols DO  
  27.       SET tmp = ExtractValue(xml,   
  28. '/mysqldump/database[@name=$database_name]/table_data[@name=$table_name]/row[$rownum]/field[$colnum]/@name');  
  29.       SET ins_list = CONCAT(ins_list, tmp, IF(colnum<ncols, ','''));  
  30.       SET tmp = ExtractValue(xml,   
  31. '/mysqldump/database[@name=$database_name]/table_data[@name=$table_name]/row[$rownum]/field[$colnum]');  
  32.       SET val_list = CONCAT(val_list, '''', tmp ,'''', IF(colnum<ncols, ','''));  
  33.       SET colnum = colnum + 1;  
  34.     END WHILE;  
  35.      SET @ins_text = CONCAT('INSERT INTO t1 (', ins_list, ') VALUES (', val_list, ')');  
  36.      SET ins_list = '';  
  37.     SET val_list = '';  
  38.      PREPARE stmt FROM @ins_text;  
  39.     EXECUTE stmt;  
  40.      SET rownum = rownum + 1;  
  41.     SET colnum = 1;  
  42.   END WHILE;  
  43. END |  
  44. DELIMITER ; 

  仔細(xì)閱讀代碼你就會發(fā)現(xiàn)其實(shí)這個(gè)存儲過程使用了我們前面使用到的工具,如LOAD_FILE()和ExtractValue()函數(shù),它只不過增加了兩個(gè)嵌套的While循環(huán),遍歷每一行和列。

  下面說說導(dǎo)入sqldump.xml文件的步驟。首先須創(chuàng)建xmldump_load存儲過程。

 

  1. C:\> mysql db_name < text_file  
  2. C:\> mysql temp_table_article < c:\xmldump_load.sql 

  你也可以使用source或\.命令從MySQL客戶端載入存儲過程。

 

  1. mysql> source c:xmldump_load.sql;  
  2. OR 
  3. mysql> \. c:xmldump_load.sql; 

  這個(gè)存儲過程接受下面三個(gè)輸入?yún)?shù):

  1.    XML輸入文件名
  2.    目標(biāo)數(shù)據(jù)庫名
  3.    要?jiǎng)?chuàng)建的表名

  我們還是以前面創(chuàng)建的sqldump.xml文件,數(shù)據(jù)庫和表名為例。

 

  1. mysql> call xmldump_load('c:\sqldump.xml ''client_info''client'); 

  這條命令將向client_info數(shù)據(jù)庫client表中插入sqldump.xml文件中的內(nèi)容。

  即將推出的新特性

  MySQL 6.0可以接受新的SQL語句,6.0.3版本將提供LOAD XML功能,直接導(dǎo)入XML文件,再也不用啥存儲過程了,在寫本文的時(shí)候還是5.4 Beta版本,因此還需耐心等候一段時(shí)間。
 

上文詳細(xì)介紹了在MySQL中使用XML數(shù)據(jù)—數(shù)據(jù)格式化,這個(gè)看上去全是代碼,可能理解起來并不是那么容易,所以就需要大家深入其中,認(rèn)真去理解,希望對大家有用處。

【編輯推薦】

  1. 詳解MYSQL中無重復(fù)插入數(shù)據(jù)更新語法
  2. 安全應(yīng)用MySQL中對自啟動(dòng)配置的要求
  3. 影響MySQL中mysqld安全的4個(gè)選項(xiàng)有哪些?
責(zé)任編輯:迎迎 來源: 比特博客網(wǎng)
相關(guān)推薦

2014-08-12 10:15:42

數(shù)據(jù)格式JSONXML

2011-04-07 10:15:00

AjaxWeb

2023-01-12 09:30:31

Linux命令行xml

2020-11-03 10:21:33

MySQL

2022-11-02 08:28:05

huskyLinter 工具

2024-01-09 08:24:49

XMLJSONJavaScript

2010-04-26 09:41:48

Oracle sqlp

2019-05-17 13:20:57

Black格式化工具Python

2009-07-28 03:39:00

ItemTemplat

2023-09-19 08:01:33

數(shù)據(jù)格式化程序

2010-07-30 10:53:53

Flex數(shù)據(jù)綁定

2010-10-14 10:03:45

MySQL命令行

2021-11-11 23:16:33

前端數(shù)據(jù)格式Web

2011-09-13 18:09:15

Eclipse And

2020-09-02 07:19:41

printf 格式化輸出Unix

2010-08-03 10:46:41

Flex代碼格式化

2009-06-05 15:27:23

Eclipse工具格式化模板應(yīng)用

2024-01-26 08:22:26

XMLJSON格式

2021-04-14 07:35:12

Json格式化日期

2013-07-02 10:25:03

LinuxUSB設(shè)備
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號