Trước khi bạn bắt đầu Về loạt hướng dẫn này Chứng chỉ Nhà phát triển ứng dụng được IBM công nhận xác nhận với những người khác rằng bạn là một nhà phát triển ứng dụng mức trung cấp hoặc
Trang 1Chuẩn bị cho kỳ thi 733 về Phát triển ứng dụng DB2 9, Phần 3: Thao tác dữ
liệu XML
Lưu trữ và lấy ra dữ liệu XML thông qua ứng dụng của bạn
Donald E Payne, Chuyên gia tư vấn IT, IBM
Tóm tắt: Tìm hiểu DB2® của IBM® phân tích cú pháp XML, xử lý khoảng
trống và tuần tự hóa XML như thế nào và xem xét cách mã hóa tài liệu và kiểu dữ liệu phía khách ảnh hưởng đến việc phân tích cú pháp và tuần tự hóa ra sao Cũng tìm hiểu cách DB2 xác nhận hợp lệ tài liệu XML dựa vào một lược đồ XML như thế nào cũng như làm thế nào để sử dụng các hàm SQL/XML để "băm nhỏ" XML thành dữ liệu quan hệ, lắp ráp ngược lại dữ liệu quan hệ thành XML và xuất bản
dữ liệu XML như là dữ liệu quan hệ
Trước khi bạn bắt đầu
Về loạt hướng dẫn này
Chứng chỉ Nhà phát triển ứng dụng được IBM công nhận xác nhận với những người khác rằng bạn là một nhà phát triển ứng dụng mức trung cấp hoặc cao cấp
về IBM DB2® dành cho Linux®, UNIX® và Windows® và chỉ ra rằng bạn có các kỹ năng giỏi trong tất cả các nhiệm vụ lập trình chung cũng như lập trình SQL nhúng, lập trình ODBC/CLI, lập trình NET hoặc lập trình Java ™
Loạt bài viết gồm chín hướng dẫn miễn phí này được thiết kế để trợ giúp cho bạn chuẩn bị cho kỳ thi lấy chứng chỉ Nhà phát triển ứng dụng DB2 9 dành cho Linux, UNIX và Windows (kỳ thi 733) Mỗi hướng dẫn bao gồm một liên kết đến một bản tải về dùng thử miễn phí DB2 9 cho Linux, UNIX và Windows Các hướng dẫn này cung cấp một cơ sở chắc chắn cho mỗi phần của kỳ thi Tuy nhiên, bạn
Trang 2không nên chỉ dựa vào các hướng dẫn này như là sự chuẩn bị duy nhất cho kỳ thi của bạn
Hướng dẫn này nói về cái gì?
Hướng dẫn này dạy cho bạn về cách DB2 và ứng dụng khách DB2 thao tác dữ liệu XML như thế nào Bạn sẽ tìm hiểu:
DB2 xử lý khoảng trống ở đầu vào như thế nào
DB2 xác định bảng mã của một tài liệu XML ở đầu vào và đầu ra như thế nào
DB2 có thể xác nhận tính hợp lệ XML ở đầu vào như thế nào
Làm thế nào để thi hành một truy vấn XQuery hay XPath và nhận biết các kết quả của nó
Làm thế nào để phân rã hoặc băm nhỏ, đầu vào XML thành các hàng trong
bảng quan hệ
Làm thế nào để xuất bản các dữ liệu quan hệ dưới dạng XML
Làm thế nào để xuất bản các dữ liệu XML như là các dữ liệu quan hệ
Đây là bài thứ ba trong một loạt bài viết gồm chín hướng dẫn được thiết kế để giúp bạn chuẩn bị cho kỳ thi lấy chứng chỉ Nhà phát triển ứng dụng DB2 9 (kỳ thi 733) Tài liệu hướng dẫn này trình bày các mục tiêu trong Phần 3 của kỳ thi, mang tên "Thao tác dữ liệu XML"
Trang 3Các điều kiện cần trước
Hướng dẫn này được viết cho các nhà phát triển DB2, những người đã quen thuộc với các khái niệm sau:
Trang 4o Biểu thức FLWOR: for, let, where, order by, return
Lược đồ XML, xác nhận hợp lệ và các vùng tên
Các khái niệm về mã hóa ký tự và mã Unicode
Đối với các ví dụ mã, bạn cần quen với
Ngôn ngữ lập trình
Bất cứ giao diện hay các thư viện nào được sử dụng, ví dụ như CLI và JDBC
Trang 5 Các kiểu dữ liệu mà ngôn ngữ lập trình đó hỗ trợ và chúng ánh xạ tương ứng tới các kiểu
Xem phần Tài nguyên để tìm các đường liên kết đến những thông tin này
Các yêu cầu hệ thống
Để hoàn thành hướng dẫn này, bạn cần những điều sau đây:
Một máy tính chạy Linux, UNIX hoặc Windows, đã cài đặt FixPack 1 DB2
9
Một trình soạn thảo, ví dụ như Rational Application Developer (Nhà phát triển ứng dụng Rational), Windows Notepad hoặc vi (xem Tài nguyên về hướng dẫn này để biết thêm thông tin)
Một trình biên dịch để chạy các ví dụ mã Trang Trung tâm thông tin DB2
về các ngôn ngữ lập trình và các trình biên dịch được hỗ trợ để phát triển ứng dụng
cơ sở dữ liệu liên kết tới các trang liệt kê các trình biên dịch được hỗ trợ trong tất
Trang 6Java application development software," để biết thêm chi tiết) Các JDK bao gồm JRE trong thư mục SQLLIB\java\jdk\jre Biến môi trường PATH của bạn cần phải bao gồm các thư mục bin trong thư mục jdk; CLASSPATH cần phải bao gồm một
số các tệp tin JAR và ZIP dưới thư mục SQLLIB\java
Cần một trình duyệt Web để tiện xem một tệp tin XML, kiểm tra xem nó có đúng khuôn dạng không và tìm ra các lỗi
Chạy các ví dụ
Nếu bạn chạy các ví dụ SQL từ hướng dẫn này trong trình xử lý dòng lệnh (CLP) DB2 db2, hãy xem phần có tên "DB2 Command Line Processor (CLP) behavior and options"
Xử lý khoảng trống trong việc phân tích cú pháp và xác nhận hợp lệ XML
XML thay đổi theo việc phân tích cú pháp (đầu vào)
Khi DB2 hoặc một trình xử lý XML khác phân tích cú pháp XML đầu vào có
nghĩa là, chuyển đổi nó từ các ký tự thành một cấu trúc nội tại nó tạo ra một số thay đổi với XML trong quá trình xử lý, như tiêu chuẩn XML đã định rõ Một số thay đổi này là quan trọng nếu bạn quan tâm đến các yêu cầu lưu trữ hoặc các yêu cầu về bộ nhớ của XML trong DB2 hoặc trong ứng dụng khách Nó cũng có thể quan trọng nếu bạn quan tâm đến các nút văn bản chỉ chứa khoảng trống, vẻ ngoài của XML khi lấy ra và tuần tự hóa trở lại thành các ký tự hoặc các chữ ký số Trình phân tích cú pháp (parser) xử lý đầu vào XML như sau:
Trang 71 Trình phân tích cú pháp sẽ xác định bảng mã Nếu bảng mã của mã nguồn không tương đương với bảng mã bên trong DB2 là UTF-8, thì các ký tự mã nguồn
được chuyển mã, hoặc được chuyển đổi từ bảng mã nguồn thành bảng mã của
DB2 Xem phần "Mã hóa XML", mục "Bảng mã nào?" để biết thêm thông tin
2 Các ký tự hết dòng là carriage return (CR, hex code 0xD) và sang dòng line
feed (LF, hex code 0xA) Các hệ điều hành khác nhau (DOS/Windows,
UNIX/Linux, Mac OS hay OS X) tuân theo các quy ước khác nhau để kết thúc các
dòng Các ký tự này được tiêu chuẩn hóa, hay là chuyển đổi thành chỉ một dạng,
LF hoặc 0xA
3 Trình phân tích cú pháp kiểm tra một tài liệu đúng ngữ pháp và cú pháp
4 Các thực thể XML bao gồm các thực thể đã định nghĩa sẵn như & và
" và các thực thể được định nghĩa trong một DTD Các tham chiếu thực thể trong tài liệu được khai triển hoặc được chuyển đổi thành giá trị của thực thể (Các
mã ký tự đã khai triển của các thực thể đã định nghĩa sẵn là nhỏ hơn thực thể hay
tham chiếu ban đầu) Bất kỳ DTD nội tại nào sẽ được loại bỏ
5 Khoảng trống là một thuật ngữ tóm bắt mọi (catch-all) ký tự không được in
ra, thường là:
o dấu cách (mã hex là 0x20)
o dấu tab (mã hex 0x9)
o Các ký tự hết dòng (như nói trên)
Khoảng trống ranh giới có thể được loại bỏ dựa trên các quy tắc mà bạn sẽ đọc
trong phần "Phân tích cú pháp và khoảng trống ranh giới" dưới đây
Trang 86 Các tham chiếu ký tự XML chẳng hạn như € (€, biểu tượng đồng euro) được khai triển hoặc chuyển đổi thành mã ký tự thực tế trong UTF-8 Giống
như với các tham chiếu thực thể đã định nghĩa sẵn, các mã ký tự đã khai triển thường nhỏ hơn các tham chiếu ban đầu
7 Khi xác nhận hợp lệ, khoảng trống có thể bỏ qua sẽ được loại bỏ Xem
phần "Xác nhận hợp lệ và khoảng trống có thể bỏ qua" dưới đây để biết thêm thông tin
Các chú thích XML (<! comment >) không được loại bỏ
Xem phần Tải về để tìm các mã mẫu giải thích việc phân tích cú pháp và xác nhận hợp lệ thay đổi khoảng trống như thế nào
Lời khuyên: Các tùy chọn -n và -q của CLP DB2 có thể ảnh hưởng đến khoảng
trống trong chuỗi ký tự bằng chữ trước khi chúng đi tới DB2 Xem phần "DB2 Command Line Processor (CLP) behavior and options" (Hành vi và các tùy chọn của trình xử lý dòng lệnh DB2) để biết thêm thông tin
Phân tích cú pháp và khoảng trống ranh giới
Khi bạn tạo ra XML, nó thường bao gồm thêm khoảng trống ranh giới để làm cho
nó "đẹp" và dễ đọc hơn Khoảng trống ranh giới trong một tài liệu XML là văn bản chỉ chứa các khoảng trống tại ranh giới giữa hai thẻ XML, mà không có ký tự không phải khoảng trống nào khác
Liệt kê1 Tài liệu XML mẫu với việc xử lý khoảng trống
Trang 9 Giữa thẻ bắt đầu <customerinfo Cid=' 1018 '> và thẻ bắt đầu <name>
Giữa thẻ bắt đầu </name> và thẻ kết thúc </name>
Trang 10 Giữa thẻ kết thúc </phone> và thẻ kết thúc </customerinfo>
Nếu việc phân tích cú pháp không bỏ đi khoảng trống này, một tài liệu "đẹp" đã phân tích xong sẽ có nhiều phần tử có nội dung hỗn hợp một sự hỗn hợp của các phần tử con và các nút văn bản và nhiều nút văn bản không có gì khác ngoài những khoảng trống
Một giá trị thuộc tính không phải là khoảng trống ranh giới, thậm chí nếu tất cả nó chỉ là các khoảng trống, như được gõ vào Trong Liệt kê 1, khoảng trống xung quanh con số 1018, các từ "Canada ca" và số điện thoại "516-555-1358" có thể là các dữ liệu không đúng dạng, nhưng nó không phải là khoảng trống ranh giới
Dưới đây là các quy tắc để loại bỏ hoặc giữ lại khoảng trống ranh giới, theo thứ tự
ưu tiên giảm dần:
1 Nếu XML chứa một phần tử với thuộc tính xml:space="preserve", thì trình phân tích cú pháp sẽ giữ lại các khoảng trống ranh giới trong phần tử đó và mọi phần tử con
2 Nếu bạn chèn XML với một hàm tường minh XMLPARSE() và chỉ rõ hoặc tùy chọn PRESERVE WHITESPACE hoặc tùy chọn STRIP WHITESPACE, thì trình phân tích cú pháp sẽ giữ lại hoặc loại bỏ khoảng trống ranh giới như được chỉ thị
3 Nếu bạn chèn XML với hàm tường minh XMLPARSE() và không chỉ rõ hoặc tùy chọn PRESERVE WHITESPACE hoặc tùy chọn STRIP WHITESPACE, thì khoảng trống ranh giới sẽ bị loại bỏ, vì đó là mặc định cho hàm XMLPARSE()
4 Việc phân tích cú pháp sẽ ngầm xảy ra khi bạn chèn XML như là một chuỗi
ký tự bằng chữ, biến chủ hoặc cái đánh dấu tham số (parameter marker) mà không
có hàm XMLPARSE() hoặc XMLVALIDATE() (XMLVALIDATE() thực hiện
Trang 11việc phân tích cú pháp để xác nhận hợp lệ, là tường minh thực sự và bỏ qua quy
tắc này) Trong việc phân tích cú pháp ngầm ẩn trong một ứng dụng CLI:
o Bạn có thể dùng lệnh SET CURRENT IMPLICIT XMLPARSE
OPTION = 'value' trong phiên làm việc của bạn, ở đây value sẽ nhận giá trị hoặc là
PRESERVE WHITESPACE hoặc STRIP WHITESPACE Nếu bạn làm thế, thì trình phân tích cú pháp sẽ giữ lại hay loại bỏ khoảng trống ranh giới tuân theo chỉ thị
o Nếu không, khi bạn sửa đổi tệp tin db2cli.ini của bạn để bao gồm thêm dòng
CurrentImplicitXMLParseOption="parse-option"
o
vào trong một [section] được đặt tên theo tên cơ sở dữ liệu của bạn name]), thì trình phân tích cú pháp sẽ giữ lại hay loại bỏ khoảng trống ranh giới
([database-cho cơ sở dữ liệu này tuân theo chỉ thị Tham số parse-option sẽ hoặc là
PRESERVE WHITESPACE hoặc STRIP WHITESPACE Ví dụ:
Trang 12UPDATE CLI CONFIGURATION FOR SECTION section-name USING CurrentImplicitXMLParseOption '"parse-option"';
o
5 Trình phân tích cú pháp loại bỏ khoảng trống ranh giới
Liệt kê 2 Ví dụ về Quy tắc 5: Chèn XML với phần tử rỗng, phân tích cú pháp ngầm ẩn, loại bỏ khoảng trống
connect to sample
insert into catalog values ('emptyelement', '<a> </a>')
DB20000I The SQL command completed successfully
select catlog from catalog where name = 'emptyelement'
<a/>
Liệt kê 3 Ví dụ về Quy tắc 2: Chèn XML với phần tử rỗng, phân tích cú pháp tường minh, giữ lại khoảng trống ranh giới
Trang 13
insert into catalog values ('preservespace', xmlparse(document '<a> </a>'
preserve whitespace))
DB20000I The SQL command completed successfully
xquery db2-fn:sqlquery('select catlog from catalog where
name = ''preservespace'' ')/a
có thể phân tích cú pháp và xác nhận tính hợp lệ chỉ trong một bước với một trình phân tích cú pháp xác nhận hợp lệ thay cho trình phân tích cú pháp mặc định
không xác nhận hợp lệ Nhưng việc xử lý được mô tả trong "Phân tích cú pháp và khoảng trống ranh giới" vẫn xảy ra trước tiên) Việc xác nhận hợp lệ luôn luôn loại
Trang 14bỏ khoảng trống có thể bỏ đi được, đó là khoảng trống đáp ứng một trong các tiêu
chuẩn sau đây:
Một kiểu phức hợp chỉ gồm phần tử là một phần tử được định nghĩa trong
XSD chỉ có các phần tử con và không có các nút văn bản nào Khoảng trống giữa các phần tử con trong một kiểu phức hợp chỉ gồm các phần tử là có thể bỏ đi được Loại khoảng trống có thể bỏ đi được này cũng là khoảng trống ranh giới, nó có thể làm cho lẫn lộn hành vi thể hiện khi phân tích cú pháp và xác nhận hợp lệ
Nếu một phần tử đơn giản (chỉ có chứa một nút văn bản) hoặc một thuộc
tính được định nghĩa trong XSD như là một kiểu không phải chuỗi ký tự (ví dụ như xs:integer, thì khoảng trống trong phần tử này hoặc giá trị thuộc tính đó có thể
bỏ qua được
Nếu việc xác nhận hợp lệ đã không bỏ qua khoảng trống này, một tài liệu "đẹp" sẽ gặp thất bại khi xác nhận hợp lệ vì nó có chứa các nút văn bản ở nơi không được phép và chứa các ký tự không phải là số trong các giá trị số Khoảng trống là một phần của một nút văn bản đã định nghĩa trong một phần tử hoặc là một phần của giá trị của một thuộc tính có kiểu xs:string là không thể loại bỏ được và không bị loại bỏ
Ví dụ, hãy xem Liệt kê 1 ở trên Theo XSD, các kiểu chuỗi ký tự duy nhất là:
Các nút văn bản trong các phần tử name (tên), street (đường phố), city (thành phố), prov-state (tỉnh-bang), pcode-zip (mã bưu điện) và phone (điện
thoại)
Các thuộc tính country (quốc gia) và type (kiểu)
Có khoảng trống có thể loại bỏ được ở các vị trí sau:
Trang 15 Giữa một thẻ bắt đầu và một thẻ bắt đầu liền ngay sau đó ví dụ, giữa
<customerinfo Cid=' 1000 '> và <name>
Giữa một thẻ kết thúc và một thẻ bắt đầu liền ngay sau đó ví dụ, giữa
</name> và <addr >
Giữa một thẻ kết thúc và một thẻ kết thúc liền ngay sau đó ví dụ, giữa
</phone> và </customerinfo>)
XSD định nghĩa thuộc tính Cid là một số nguyên:
<xs:attribute name="Cid" type="xs:integer" />
Vì vậy khoảng trống xung quanh "1000" là có thể loại bỏ được và sẽ được
loại bỏ
Khoảng trống trong các phần tử name, street, city, prov-state, pcode-zip và phone
không thể loại bỏ được
Các lời khuyên:
Một số các kịch bản lệnh mẫu mà bạn có thể tìm thấy tại
SQLLIB\samples\xml\db2sample_xml.db2 trong bản cài đặt DB2 của bạn chèn
XML như thế này:
XMLVALIDATE( XMLPARSE ( DOCUMENT ' ' PRESERVE WHITESPACE ) )
Trang 16
Ví dụ:
INSERT INTO CUSTOMER ( Cid, Info ) VALUES (
1000,XMLVALIDATE( XMLPARSE ( DOCUMENT
'<customerinfo xmlns="http://posample.org" Cid=''1000''> '
PRESERVE WHITESPACE ) )
Hàm XMLPARSE() giữ lại khoảng trống ranh giới; nhưng
XMLVALIDATE() loại bỏ khoảng trống có thể loại bỏ được
CLP DB2 có thể loại bỏ khoảng trống trong chuỗi ký tự bằng chữ, bao gồm XML, trước khi gửi đến DB2 Xem một phần trong hướng dẫn này có tên "DB2 Command Line Processor (CLP) behavior and options" để biết thêm thông tin
CLP DB2 không phải là một ứng dụng CLI, do đó các tùy chọn CLI không
áp dụng cho nó
Sự tuần tự hóa XML
XML thay đổi tại đầu ra
Trang 17Khi DB2 tuần tự hóa XML, hoặc chuyển đổi nó từ cấu trúc nội tại trở lại thành
các ký tự, như khi phân tích cú pháp, chuẩn XML chỉ rõ một số các thay đổi đối với dữ liệu, do đó nó có thể trông khác với những gì ở đầu vào Mục đích và hiệu quả của những sự thay đổi này là để tạo ra một chuỗi ký tự là tài liệu XML hợp lệ,
mà sau đó có thể được phân tích lại
Nếu bảng mã đích không hoàn toàn giống như bảng mã bên trong DB2 là
UTF-8, thì các ký tự UTF-8 được chuyển mã theo dạng đích Các ký tự là các tham chiếu ký tự tại đầu vào vẫn giữ nguyên là ký tự thực tế tại đầu ra, chúng
không phải mã hóa lại như một tham chiếu Các ký tự không có trong bộ ký tự đích sẽ bị mất, được thay thế bằng một ký tự như "?" Xem một phần trong hướng dẫn này mang tên "XML encoding" để biết thêm thông tin
Một khai báo XML được tạo ra nếu bất kỳ điều nào sau đây là đúng:
o Bạn thực hiện tuần tự hóa tường minh với expression INCLUDING XMLDECLARATION)
XMLSERIALIZE(XML-o Ứng dụng khách là một ứng dụng CLI hoặc ứng dụng SQL nhúng (ESQL)
o Ứng dụng khách là một ứng dụng Java hoặc ứng dụng NET, sử dụng trình điều khiển DB2 cho JDBC và SQLJ, trình này lấy ra XML thành một đối tượng DB2Xml sử dụng lớp com.ibm.db2.jcc.DB2Xml
Một mã đánh dấu trình tự byte (BOM) được tạo ra nếu bảng mã đích là
UTF-16
Các ký hiệu và (&), nhỏ hơn (<) và lớn hơn (>) được thay thế bằng các thực thể XML của chúng (tương ứng là (&, < và >)
Trang 18 Trong các thuộc tính, hai dấu nháy kép (") được thay thế bằng thực thể XML của chúng (")
Trong các giá trị thuộc tính, các ký tự khoảng trống nhất định chẳng hạn như CR, LF, và tab còn chưa được tiêu chuẩn hóa với XML ở đầu vào được
thay thế bằng tham chiếu số của chúng, &#n;, ở đây n là mã hex
Bởi vì các DTD nội tại được bỏ đi khi nhập đầu vào, các ký tự đã được khai
triển từ một thực thể được định nghĩa trong một DTD không được mã hóa trở lại
như là một tham chiếu thực thể, mà giữ nguyên dạng đã khai triển của chúng
Một phần tử rỗng là một phần tử không có nội dung có nghĩa là, không
có văn bản hoặc các nút nào giữa các thẻ bắt đầu và kết thúc Khi được tuần tự hóa
ở đầu ra, nó sẽ xuất hiện chỉ như là một thẻ phần tử rỗng, <tag-name/>
Lời khuyên: tùy chọn -i của CLP DB2 "in đẹp" kết quả đầu ra của một XQuery, bằng cách thêm các dấu ngắt dòng và thụt dầu dòng Tùy chọn -d tạo ra một khai báo XML ở phần đầu của tài liệu Xem một phần trong hướng dẫn này mang tên
"DB2 Command Line Processor (CLP) behavior and options" để biết thêm thông tin
Mã hóa XML
Bảng mã ký tự
Trước đây, các thuật ngữ bộ ký tự, mã hóa ký tự (character set, character
encoding) và trang mã (code page) tất cả đều có một ý nghĩa tương tự như nhau:
một bộ các ký tự và một bộ các mã nhị phân, ở đó mỗi mã biểu diễn cho một ký
Trang 19tự (Trang mã là một thuật ngữ của IBM dành cho một bộ ký tự dùng trên một
máy tính lớn hoặc máy tính cá nhân IBM PC) Các tên chính thức của các bộ ký tự được duy trì bởi IANA (Internet Assigned Numbers Authority - một cơ quan thẩm quyền trông coi việc cấp phát địa chỉ IP, tên miền mức đỉnh và điểm mã giao thức Internet); xem phần Tài nguyên để biết thêm thông tin
Các bảng mã ký tự di sản thừa kế
Một số các bộ ký tự di sản thừa kế phổ biến trong thế giới phương Tây là ASCII, EBCDIC, trang mã 437, trang mã 1252, 8859-1, 1208, và Latin-1 Tất cả chúng mã hoá một ký tự là một byte
US- Trang mã 437: Trong Microsoft Windows ở Hoa Kỳ, trang mã mặc định là
437; tên bảng mã chính thức IANA là ibm-437 Nó có một số ký tự không phải là tiếng Anh (ví dụ, chữ ghép dính "ae", các nguyên âm chữ thường có dấu trọng âm, một số các chữ cái Hy Lạp, các dấu ngoặc kép Pháp ("<<" và ">>") và 48 ký tự cho đồ họa để tô bóng và tạo các hộp (một di sản thừa kế từ hệ điều hành DOS và các chương trình dựa trên ký tự)
Trang mã 1252: DB2 có hai mục trong nhóm trình đơn Start của nó dưới các công cụ dòng lệnh (Command Line Tools:) Bộ xử lý dòng lệnh (Command Line Processor) và cửa số lệnh (Command Window) Cả hai bắt đầu bằng cách
chạy một chương trình db2clpcp.exe, nó thay đổi trang mã từ trang 437 mặc định (một lần nữa, tại Hoa Kỳ) thành trang 1252 Trang mã 1252, mà Microsoft cũng gọi là "La-tinh-1", có chữ ghép dính "ae", các ký tự chữ hoa và chữ thường có dấu trọng âm và biểu tượng euro (mã hex 0x80), nhưng không có các chữ Hy Lạp
Trang mã 1208: Khi bạn dùng lệnh CREATE DATABASE USING
CODESET UTF-8 (Tạo cơ sở dữ liệu sử dụng bộ mã UTF-8), trang mã cơ sở dữ liệu tương ứng là 1208:
Trang 20db2 get db cfg for sample | grep "code"
Database code page = 1208
Database code set = UTF-8
Database country/region code = 1
Bộ ký tự iso-8859-1: Bộ ký tự này, cũng được gọi là Latin-1, là phổ biến
trong các trang Web tiếng Anh hoặc Tây Âu Nó có chữ ghép dính "ae", các chữ cái Latinh chữ hoa và chữ thường có dấu trọng âm, không có chữ cái tiếng Hy Lạp
và không có ký hiệu euro
Xem Tài nguyên với các đường các liên kết đến các định nghĩa của các bộ ký tự này và các định nghĩa khác
Unicode
Bất kỳ một bảng mã di sản kế thừa đơn lẻ nào đều có các hạn chế do nó chỉ có thể biểu diễn văn bản trong một tập hợp nhỏ các ngôn ngữ Việc quản lý nhiều bảng
mã là rất đau đầu vì nhiều lý do, không chỉ vì hầu hết các ứng dụng và cơ sở dữ
liệu đã được thiết kế để xử lý chỉ một bảng mã Unicode đã được phát minh để giải
quyết vấn đề này Nó là một bộ ký tự đơn lẻ, biểu diễn được tất cả các ký tự trong hầu như tất cả các ngôn ngữ đang sử dụng, và có dành chỗ để phát triển thêm
Trang 21Với mã Unicode, ý tưởng đơn giản về một bộ ký tự đã được tinh lọc thành bốn khái niệm:
Một kho ký tự chỉ đơn thuần là một bộ tất cả các ký tự có thể được mã hóa,
nó không chỉ rõ bảng mã
Một bộ ký tự được mã hóa một bộ các số nguyên duy nhất để biểu diễn một
số hoặc tất cả các ký tự trong một kho ký tự, một số (hoặc điểm mã (code point)) dành cho một ký tự Nó còn được gọi là bộ ký tự (character set, charset), hoặc bộ
mã (code set) Nó đồng nghĩa với trang mã (code page) Các điểm mã Unicode
nằm trong dải 0 đến 0x10FFFF (khoảng 1,1 triệu mã)
Ban đầu, mã Unicode đã định nghĩa một kho ít hơn 64.000 ký tự, nên nó có thể định rõ một bộ ký tự được mã hóa với các điểm mã 16-bit (2-byte) Với việc
bổ sung thêm nhiều các bảng chữ cái, kho ký tự đã vượt quá 64.000 Một vấn đề khác là có nhiều hệ thống máy tính (đặc biệt là các chương trình được viết bằng ngôn ngữ C) xử lý US-ASCII hoặc những hệ thống khác sử dụng một byte null hoặc byte số không (\0 trong C) để đánh dấu sự kết thúc của một chuỗi ký tự Thế nhưng việc mã hóa các điểm mã Unicode trực tiếp thành 16-bit, hoặc nhiều bít hơn
sẽ bao gồm một số byte null, điều này có thể làm đổ vỡ các chương trình nói trên
Do đó Unicode đã đưa vào một khái niệm mới character encoding form (CEF - mẫu biểu mã ký tự), thường được viết tắt là character encoding (bảng mã ký tự) hoặc chỉ đơn giản là encoding encoding (bảng mã) Một CEF là một ánh xạ từ các điểm mã trong bộ ký tự được mã hóa tới một bộ các số nguyên khác nhau (hoặc các đơn vị mã (code units)) trong đó các ký tự sẽ thực sự được mã hoá Các đơn vị
mã là đơn vị nhỏ nhất được sử dụng để mã hóa các ký tự Một ký tự duy nhất có thể được biểu diễn bởi một hay nhiều đơn vị mã, cho phép nhiều ký tự hơn được
mã hóa
Trang 22Vì vậy các điểm mã chỉ để tham chiếu, do đó bạn có thể nói ký tự "đó" thực tế
trong chuỗi ký tự của Java, chuỗi ký tự char[] của C hoặc tệp tin có thể khác nhau, tùy thuộc vào bảng mã ký tự của bạn Một số bảng mã ký tự Unicode là UTF-8, UTF-16 và UTF-32 Những con số 8, 16 và 32 biểu thị số bit trong đơn vị mã
o UTF-8 (mà DB2 sử dụng) sử dụng từ 1 đến 4 đơn vị mã (byte, trong trường hợp này) cho mỗi ký tự Điều này rất quan trọng khi định kích cỡ các cột [VAR]CHAR trong một cơ sở dữ liệu UTF-8: một ký tự có thể chiếm từ 1 đến 4 byte Bảng mã ký tự UTF-8 không chứa bất kỳ byte null nào, rất thuận tiện cho ngôn ngữ C
o Trong bảng mã ký tự UTF-16 (mà ngôn ngữ Java sử dụng), các điểm
mã được sử dụng phổ biến nhất thấp hơn 64K và mã ký tự UTF-16 đơn giản là bằng điểm mã Điểm mã cao hơn đòi hỏi hai đơn vị mã
o UTF-32 là bảng mã UTF có kích thước cố định duy nhất, nó làm đơn giản hoá một số việc xử lý với chi phí không gian nhớ tăng lên Đơn vị mã luôn luôn bằng điểm mã
Kể từ khi chuẩn Unicode hạn chế các điểm mã hợp pháp sao cho tất cả các bảng
mã UTF có thể biểu diễn bất kỳ điểm mã nào, việc chuyển đổi mã giữa các UTF được đảm bảo không bị mất mát
Các điểm mã Unicode thường được viết trong tài liệu dưới dạng U+hhhh , ở đây hhhh đại diện cho 4 chữ số hexadecimal với điểm mã 2-byte; đối với các điểm mã
trên 64K, hãy sử dụng cú pháp này hai lần với 4 byte Lưu ý rằng cú pháp này được sử dụng trong tài liệu, nhưng XML và các ngôn ngữ lập trình có cú pháp riêng của chúng để chỉ rõ chuỗi ký tự bằng chữ Unicode; xem phần mang tên
"Characters in code" (Ký tự trong mã lệnh) dưới đây để biết thêm thông tin
Trang 23 Một lược đồ mã hóa ký tự cho biết làm thế nào để sắp xếp thứ tự các byte
trong một đơn vị mã trong một luồng byte biểu diễn các ký tự UTF-16 và UTF-32 cung cấp các cách để xác định thứ tự byte, đó là big-endian (mặc định), hoặc little-endian Đối với UTF-8, một đơn vị mã là 1 byte, do đó không có thứ tự nói cách khác, việc sắp xếp thứ tự luôn luôn là như nhau bất kể thứ tự endian của máy tính
Bảng mã nào?
Bất cứ điều gì có xử lý dữ liệu ký tự cần phải biết bộ ký tự, bảng mã ký tự và lược
đồ mã hóa ký tự của dữ liệu đó
Bảng mã ngoài
Ngoài XML, văn bản chỉ có bảng mã ngoài Bảng mã ngoài được định nghĩa bởi
trang mã hoặc địa phương (locale) trong môi trường; bởi ứng dụng; bởi kiểu biến; hoặc một bảng mã được chỉ rõ trong một hàm hoặc phương thức (ví dụ như
phương thức String.getBytes(String encoding))
Để xác định trang mã cơ sở dữ liệu trong đó một cơ sở dữ liệu đã được tạo ra, hãy
chạy:
db2 get db cfg for database-name
Trang 24
và kiểm tra giá trị của tham số Database code page (Trang mã cơ sở dữ liệu)
Trên Windows, một số khía cạnh của bảng mã phụ thuộc vào phiên bản đã cài đặt của hệ điều hành Chương trình máy khách (applet) "Các tùy chọn Vùng và Ngôn ngữ" (Regional and Language Options) trong bàn điều khiển (Control Panel) cho phép bạn thay đổi một số khía cạnh về địa phương (locale) và bàn phím của bạn Bạn có thể biết trang mã của bạn là gì bằng cách mở một cửa sổ lệnh và gõ lệnh CHCP
Trên Linux và UNIX, môi trường hoạt động được xác định từ các giá trị thiết lập địa phương, trong đó bao gồm các thông tin về ngôn ngữ, lãnh thổ và bộ mã Để xác định trang mã đang hoạt động, hãy chạy:
locale
Bảng mã trong
Dữ liệu XML cũng có thể có bảng mã trong Bảng mã trong là nội bộ ở bên trong
tài liệu XML Có hai loại:
Thuộc tính Encoding
Byte Order Mark (BOM-Mã đánh dấu thứ tự byte)
Thuộc tính Encoding cho khai báo XML, ở phía trên cùng của tài liệu, chỉ rõ một
tên bảng mã IANA chính thức:
Trang 25<?xml version="1.0" encoding="UTF-8" ?>
Một BOM là một loạt các byte riêng biệt, ngay tại chỗ bắt đầu của tệp tin, chỉ báo
một bảng mã Unicode Để đọc khai báo XML, một trình phân tích cú pháp XML cần phải biết hoặc dự đoán bảng mã đó Nhưng nó có thể đọc BOM một cách chính xác
Bảng 1 BOM dành cho bảng mã Unicode
Kiểu BOM Giá trị BOMBảng mã
UTF-16 Big Endian X'FEFF' UTF-16
UTF-16 Little Endian X'FFFE' UTF-16
UTF-32 Big Endian X'0000FEFF' UTF-32
UTF-32 Little Endian X'FFFE0000' UTF-32
Bảng mã không nhất quán
Trang 26Nếu bảng mã thực tế, bảng mã ngoài hay các bảng mã trong (BOM hoặc khai báo XML) của một tài liệu XML không phù hợp với nhau, thì tài liệu sẽ không thể đọc được Một ngoại lệ là khi bảng mã bên ngoài là Unicode (ví dụ, một chuỗi ký tự Java theo UTF-16): bất kỳ bảng mã trong nào bị cũng bị bỏ qua Một vấn đề
thường xảy ra khi một tiến trình không hiểu XML thực hiện các phép chuyển mã
(có nghĩa là, thay đổi bảng mã thực tế) hoặc thay đổi một tài liệu mà không biết rõ
về bảng mã trong Một số việc xử lý các chuỗi ký tự trong ngôn ngữ Java, CLI và các ứng dụng SQL nhúng có thể chuyển mã mà không thay đổi bảng mã trong Xem phần dưới đây mang tên "Recommendations" (Các khuyến cáo) về cách làm thế nào để tránh điều này
Các ký tự trong mã hóa
Trong Windows, để nhập văn bản của một ngôn ngữ khác tại bàn phím của bạn, bạn có thể thay đổi ngôn ngữ đầu vào và bố trí bàn phím trong Control Panel của Windows, trong mục "Regional and Language Options"; nhấn chuột vào nút
Details trên phiếu Languages Bạn có thể thêm nhiều ngôn ngữ và các bàn phím và chuyển đổi giữa chúng bằng một phím nóng (Xin lỗi, không có "ngôn ngữ" hoặc bàn phím Unicode nó sẽ phải khá lớn đấy!)
Tiện ích Notepad của Windows có thể lưu các tệp tin với bảng mã "ANSI" (là windows-1252 hay tương tự), bảng mã "Unicode” (UTF-16 little endian, thứ tự endian của các CPU Intel và AMD), bảng mã "Unicode big endian"( mặc định UTF-16) và UTF-8 Đối với các bảng mã UTF, Notepad gắn thêm vào đầu tệp tin một BOM (nhưng không có khai báo XML)
Trang 27Trong một chuỗi ký tự Java bằng chữ, theo mã Unicode, sử dụng một dãy thoát:
\udddd , ở đây dddd biểu diễn 4 chữ số hex của điểm mã Unicode
Trong XML và HTML, bạn có thể sử dụng một tham chiếu số XML (hoặc tham chiếu ký tự) cho một điểm mã, đó là : &#n , ở đây n ở đây n là một số thập phân
cho điểm mã Unicode Ví dụ, tham chiếu thập phân cho biểu tượng đồng tiền euro
là € Để thay thế bạn có thể chỉ rõ điểm mã như là một số hệ mười sáu (hex)
bằng cách đặt trước số đó ký tự x: &#xn Ví dụ, euro sẽ là € Một tham
chiếu số hệ mười sáu thường thuận tiện hơn, bởi vì điểm mã thường được chỉ rõ bằng số hệ mười sáu Đối với các tham chiếu số, các số không đứng đầu có thể được bỏ qua Mỗi ký tự phải dùng dấu thoát hoặc được tham chiếu một cách riêng biệt: ví dụ, "!"" là "!”" (dấu chấm than, dấu nháy kép), trong khi
"™" là dấu "™" (nhãn hiệu đăng ký hàng hoá)
Bảng 2 minh họa một số ký tự mẫu, với điểm mã Unicode và mã ký tự của chúng trong các bảng mã UTF và hai trang mã phương Tây di sản thừa kế
Bảng mã trong ngôn ngữ Java
Các chuỗi ký tự (String) của Java (và các mã định danh như các tên lớp và tên
phương thức) được mã hóa bằng UTF-16, nhưng tệp mã nguồn của bạn được giả định là dùng trang mã hiện tại, chứ không phải UTF-16 Khi biên dịch một
chương trình Java với javac, trình biên dịch sẽ chuyển đổi bất kỳ chuỗi ký tự bằng chữ nào từ bảng mã của tệp mã nguồn thành UTF-16 Để chỉ rõ rằng tệp mã nguồn
là trong bảng mã khác, hãy sử dụng tùy chọn mã hóa của javac -encoding set-name Điều này cho phép bạn sử dụng một bảng mã khác trong các mã định
code-danh và các chuỗi ký tự bằng chữ của bạn
Trang 28DB2 9 cung cấp một lớp trình trợ giúp (helper), com.ibm.db2.jcc.DB2Xml, để giúp chuyển giao và chuyển đổi dữ liệu giữa cơ sở dữ liệu và ứng dụng Java Nó hiểu XML tốt hơn; ví dụ, một số các phương thức có thể chuyển đổi bảng mã bên trong của một tài liệu XML được tuần tự hóa tuân theo bảng mã thực tế, do đó, chúng vẫn còn nhất quán
Bảng 3 Các phương thức getter của JDBC: Kiểu trả về, bảng mã và khai báo
Phương thức Kiểu trả về Bảng mã
Có bổ sung thêm khai báo XML với thuộc tính encoding
không?
getDB2XmlString() String
10646-UCS-2
getDB2AsciiStream() InputStream ASCII Không
Trang 29getDB2XmlAsciiStream() InputStream ASCII Có
getDB2CharacterStream() java.io.Reader UTF-16 Không
getDB2XmlCharacterStream() java.io.Reader
10646-UCS-2
DB2 9 đi kèm với 2 trình điều khiển JDBC có thể kết nối với DB2 theo ba cách khác nhau (DB2 9 không hỗ trợ các trình điều khiển Kiểu 3 của JDBC):
Trình điều khiển DB2 cho JDBC và SQLJ, một trình điều khiển JDBC phổ quát, nó có thể kết nối như là:
o Một trình điều khiển Kiểu 4 của JDBC
o Một trình điều khiển Kiểu 2 của JDBC
Một trình điều khiển Kiểu 2 JDBC của DB2 (một trình điều khiển di sản thừa kế)
Trang 30Bạn nên sử dụng trình điều khiển DB2 phổ quát cho JDBC và SQLJ Trình điều khiển Kiểu 2 di sản thừa kế đã bị lạc hậu kể từ phiên bản DB2 8.2 Trình điều khiển JDBC Kiểu 2 di sản không làm việc với lớp DB2
com.ibm.db2.jcc.DB2Xml, và nó xử lý XML khác đi trong một số phương thức JDBC Ví dụ, các phương thức, get (chẳng hạn như,
ResultSet.getBinaryStream(column), ResultSet.getCharacterStream(column), ResultSet.getString(column)) trong một câu lệnh SELECT lấy ra một cột XML
(không dùng XMLSERIALIZE() tường minh) sẽ thêm một BOM và khai báo XML vào kết quả XML đã tuần tự hóa Hoặc bảng mã trong (UTF-16) không khớp với bảng mã thực tế hoặc là BOM bị hỏng, đều làm cho tài liệu không thể sử dụng được
Xem Bảng 4 để biết thêm thông tin về các phiên bản của trình điều khiển JDBC
Đối với bất kỳ kiểu kết nối JDBC nào, nếu bạn muốn kết nối như là một người dùng khác với người dùng hiện tại, bạn phải chỉ rõ tên người dùng mong muốn và mật khẩu hoặc trong URL kết nối hoặc trong đối số Properties của phương thức getConnection()
DB2 cung cấp các ứng dụng JDBC mẫu trong thư mục
IBM\SQLLIB\samples\xml\java\jdbc, chẳng hạn như XmlInsert.java Nếu bạn sử dụng chúng để thử nghiệm, hãy lưu ý rằng theo mặc định, chúng kết nối đến DB2 với trình điều khiển Kiểu 2 di sản thừa kế (Xem lớp của trình trợ giúp Db trong tệp tin Util.java) Để kết nối với các trình điều khiển Kiểu 4, bạn phải chỉ rõ các đối số dòng lệnh dành cho máy chủ, cổng, người dùng và mật khẩu Để xem một thông báo về cú pháp, hãy chạy lớp với đối số dòng lệnh -help:
prog_name -u2 [dbAlias] [userId passwd] (use universal JDBC type 2 driver) prog_name [dbAlias] server portNum userId passwd (use universal JDBC type 4
Trang 31driver)
Ví dụ:
java -cp ".;%CLASSPATH%" XmlInsert sample myhost 50000 myuser mypasswd
Xem phần Tải về để lấy các mã ví dụ giải thích cách DB2, JDBC và lớp DB2Xml
Bảng 5 Các kiểu CLI
Trang 32Kiểu dữ liệu Bảng mã được giả định tại đầu
vào
Bảng mã được sinh ra tại
đầu ra
SQL_C_CHAR Trang mã của ứng dụng Giống như đầu vào
SQL_C_DBCHAR Trang mã của ứng dụng Giống như đầu vào
SQL_C_BINARY Đọc bảng mã bên trong UTF-8
Bảng mã trong SQL nhúng
Khi bạn chèn XML vào trong DB2 từ một biến chủ SQL nhúng (ESQL), bảng mã của XML được xác định theo các quy tắc đầu vào trong Bảng 6 Nếu bảng mã được xác định bởi trang mã của ứng dụng, nhưng tài liệu cũng có một bảng mã trong (BOM hoặc khai báo XML), thì các bảng mã ngoài và bảng mã trong phải phù hợp với nhau Khi bạn chọn lấy ra XML từ DB2 vào trong một biến chủ
ESQL, dữ liệu được mã hoá theo Bảng 6, với một bảng mã bên trong (một khai báo XML với thuộc tính mã hóa)
Trang 33Bảng 6 Các kiểu ESQL
KIểu SQL là Bảng mã được giả định
tại đầu vào
Một kiểu đơn giản như char[] Trang mã hỗn hợp của
ứng dụng (Chú ý 2) Giống như đầu vào
Chú ý 1: Nếu một biến kiểu BLOB không có bất kỳ bảng mã bên trong nào, DB2 giả định là UTF-8
Chú ý 2: Để chèn XML từ một kiểu đơn giản như char, hãy tạo khuôn mẫu cho nó thành XML bằng hàm XMLCAST(? AS XML)
Trang 34
Các khuyến cáo
Hãy chuyển các chuỗi ký tự bằng chữ như là các lời nhắc và các thông báo lỗi ra khỏi tệp mã nguồn của bạn và đưa vào một dạng tệp thuộc tính hoặc tệp khởi tạo nào đó hay đưa vào một bảng cơ sở dữ liệu Điều này sẽ làm dễ dàng hơn khi dịch các ứng dụng của bạn sang các ngôn ngữ khác Bạn có thể phải mã cố định một vài thông báo lỗi vào trong các ứng dụng của bạn, trong trường hợp ứng dụng này không thể mở tệp tin thông báo đó hoặc chọn lấy ra từ bảng các thông báo đó
Hãy tránh chuyển mã giữa các bộ ký tự không phải mã Unicode, vì sợ rằng bạn sẽ mất các ký tự không có trong bộ ký tự đích
Hãy thử nghiệm các ứng dụng của bạn không viết bằng ngôn ngữ Java với các trang mã khác nhau trong môi trường ứng dụng Bạn có thể không có khả năng kiểm soát trang mã của những người dùng của bạn (Trang mã ứng dụng Java luôn luôn là UTF-16)
Hãy thử nghiệm ứng dụng của bạn với một số dữ liệu không phải mã
ASCII Các trang mã 437, 1252, 8859-1 và 1208 (bảng mã UTF-8) tất cả khớp với
mã US-ASCII trong 128 byte đầu tiên, do đó dữ liệu mã US-ASCII ít có khả năng gặp bất kỳ vấn đề nào về mã hóa và chuyển mã Kiểm tra về việc mất các ký tự lúc chuyển mã, nó thường không tạo ra thông báo lỗi
Hãy sử dụng trình điều khiển DB2 phổ quát cho JDBC và SQLJ hơn là dùng trình điều khiển Kiểu 2 di sản thừa kế Nếu bạn không thể kiểm soát trình điều khiển mà các ứng dụng của bạn sử dụng, thử nghiệm nó với một kiểu hoặc các kiểu sẽ chạy trong sản xuất và tránh các phương thức không làm việc trong tất
cả các kiểu hoặc làm việc một cách khác nhau
Đối với các ứng dụng C, để xử lý XML trong kiểu dữ liệu char[], hãy sử dụng bảng mã UTF-8, vì nó không chứa null (\0) như là một byte hợp lệ
Trang 35 Đối với các ứng dụng CLI và ESQL, hãy lưu ý rằng CLI trả về dữ liệu XML với bảng mã bên trong Nếu bạn chuyển mã và thay đổi bảng mã thực tế, tài liệu sẽ trở nên không sử dụng được Để tránh điều này, hãy kết buộc biến ứng dụng của bạn tới kiểu SQL_C_BINARY; điều này cũng giữ các dữ liệu dưới dạng UTF, tránh việc bị mất mát khi chuyển mã thành trang mã nội bộ của bạn
Đối với bất kỳ kiểu dữ liệu nào chứa các ký tự UTF, hãy cho phép đủ độ rộng, bởi vì một ký tự có thể dùng nhiều hơn một byte
thế giới XML, có khái niệm về xác nhận hợp lệ được các lược đồ XML cung cấp
Một Lược đồ XML giống như một cuốn sách quy tắc cho các tài liệu XML khác
Nó cung cấp thông tin chi tiết về những gì được phép trong các tài liệu XML các tên nút, thứ tự các nút, các thuộc tính, các kiểu dữ liệu, là tùy chọn hay bắt buộc phải có, v.v Bản sao của nó trong thế giới quan hệ trong DB2 là
SYSCAT.COLUMNS Các lược đồ XML bản thân chúng chính là các tài liệu XML, có các quy tắc rất cụ thể về cấu trúc riêng của nó Một tài liệu XML tuân
Trang 36thủ đúng các quy tắc của một Lược đồ XML gọi là đã được được xác nhận hợp lệ hay hợp lệ
Làm thế nào để xác nhận hợp lệ
Trong một cột cơ sở dữ liệu có kiểu XML, mỗi hàng có chứa chính xác một tài liệu XML đầy đủ (hoặc một giá trị null) Tài liệu đó hoặc là hợp lệ hoặc không Việc xác nhận hợp lệ được thực hiện bằng hàm XMLVALIDATE() Để thực hiện việc xác nhận tính hợp lệ, trước tiên phải đăng ký với cơ sở dữ liệu các tài liệu Lược đồ XML (XSD - XML Schema Documents) thích hợp Sau đó, có thể sử dụng hàm XMLVALIDATE() Hàm này chấp nhận một tài liệu XML như là đầu vào, cùng với mã định danh (ID) một Lược đồ XML phù hợp và trả về một tài liệu XML được xác nhận hợp lệ
Các cách để xác nhận tính hợp lệ tài liệu XML trong một cột XML (lưu ý rằng
không bao gồm câu lệnh LOAD):
Câu lệnh INSERT: Sử dụng XMLVALIDATE()
Câu lệnh UPDATE: Sử dụng XMLVALIDATE()
Câu lệnh IMPORT: Có cú pháp để xác nhận tính hợp lệ
Một ví dụ đầy đủ về việc đăng ký một Lược đồ XML và sử dụng
XMLVALIDATE() có thể tìm thấy trong bài viết "Get off to a fast start with DB2 Viper" (Hứng khởi để bắt đầu nhanh với DB2 Viper ) (developerWorks, 03 2006)
Trang 37
Kiểm tra để xác nhận hợp lệ
Một cột XML có thể được kiểm tra để xác định xem nó chứa một tài liệu XML hợp lệ hay không với vị từ VALIDATED
Ví dụ 1: Giả sử rằng cột XMLCOL được định nghĩa trong bảng T1 Hãy lấy ra chỉ
các giá trị XML đã được xác nhận hợp lệ bởi một lược đồ XML bất kỳ
Ví dụ 2: Giả sử rằng cột XMLCOL được định nghĩa trong bảng T1 Hãy buộc
tuân thủ quy tắc là các giá trị không thể được chèn vào hoặc được cập nhật trừ khi chúng đã được xác nhận hợp lệ
ALTER TABLE t1
Trang 38ADD CONSTRAINT ck_validated
CHECK (xmlcol IS VALIDATED)
Lưu ý rằng ràng buộc này kiểm tra xem liệu cột XML có được xác nhận hợp lệ
bằng bất kỳ Lược đồ XML nào không Bạn không thể bắt buộc xác nhận hợp lệ bằng một lược đồ cụ thể
Để tìm ra Lược đồ XML cụ thể nào đã được sử dụng để xác nhận tính hợp lệ một tài liệu XML, hãy sử dụng hàm XMLXSROBJECTID() Nó trả về khóa của một hàng trong bảng SYSCAT.XSROBJECTS
XPath và XQuery
XPath và XQuery đã được trình bày trong một số hướng dẫn Xem các liên kết sau trong phần Tài nguyên:
"DB2 9 Fundamentals exam 730 prep, Part 7: Introducing XQuery" (Chuẩn
bị kỳ thi 730, Cơ bản về DB2 9, Phần 7: Giới thiệu về XQuery) (developerWorks,
07 2006)
"SQL and XQuery tutorial for IBM DB2, Part 7: Introduction to XML and XQuery" (Hướng dẫn SQL và XQuery cho DB2 IBM, Phần 7: Giới thiệu về XML
và XQuery) (developerWorks, 08.2006)
Trang 39 Trang XML Related Technologies Các công nghệ liên quan đến XML) (W3Schools)
IBM Certified Solution Developer: XML 1.1 and Related Technologies (Nhà phát triển giải pháp được IBM chứng nhận: XML 1.1 và các công nghệ liên quan)
Đọc các truy vấn ví dụ, dự đoán các kết quả, sau đó kiểm tra câu trả lời của bạn bằng cách chạy các truy vấn đối với DB2
Các hàm SQL/XML
Hàm vô hướng XMLQUERY() và XMLEXISTS()
Hàm XMLQUERY() trả về một giá trị XML sau khi đánh giá một biểu XQuery,
có thể sử dụng các đối số đầu vào đã chỉ rõ như các biến XQuery
Đây là trích ra nguyên xi từ hướng dẫn sử dụng Vậy thì, ý nghĩa thực tế của điều này là gì? Hàm XMLQUERY() có hai phần:
có được toàn bộ tài liệu XML Nếu bạn muốn một phần nhỏ trong toàn bộ tài liệu,
Trang 40thì bạn sử dụng hàm XMLQUERY() Đối với biểu thức XQuery, bạn có thể sử dụng một biểu thức XPath đơn giản như '$d/path1/path2/path3', hay một biểu thức FLWOR đầy đủ Ký hiệu $d nói tới một biến trong mệnh đề PASSING Mệnh đề này cho phép dữ liệu (các cột, các biểu thức, các dữ liệu bằng chữ) được chuyển vào biểu thức XQuery Để trích một phần của một tài liệu XML, tên cột XML được đưa vào trong mệnh đề PASSING và đặt cho một cái tên, vị dụ như "d" Sau
đó, biểu thức XQuery được nói đến như là $d
XMLEXISTS() là một vị từ được sử dụng trong mệnh đề WHERE của một câu lệnh SELECT Cú pháp của nó tương tự như XMLQUERY(): nó có một biểu thức XQuery và một mệnh đề PASSING Giống như với XMLQUERY(), đối số
XQuery có thể là một biểu thức XPath đơn giản hoặc biểu thức FLWOR đầy đủ Nếu biểu thức XQuery trả về ít nhất một mục, thì XMLEXISTS() trả về TRUE
XMLEXISTS() thường được sử dụng để kiểm tra xem một tài liệu XML (trong
một cột XML) có chứa một cái gì đó đáng quan tâm không Một cái gì đó có thể là
sự tồn tại của một nút XML đặc biệt, sự tồn tại của một thuộc tính, một giá trị cụ thể cho một nút XML hay giá trị cụ thể cho một thuộc tính Nhiều điều kiện có thể được kiểm tra Thường là hiệu quả hơn nhiều khi kết hợp nhiều điều kiện XML thành một XMLEXISTS() với các toán tử and và or của XPath, hơn là thực hiện nhiều cuộc gọi XMLEXISTS() kết hợp với AND và OR của SQL
Nhiều truy vấn XML có thể được xử lý bằng cả XQuery lẫn XMLQUERY() Có một số khác biệt giữa XQuery và XMLQUERY():
XQuery trả về mỗi mục trong dãy kết quả như là một hàng riêng biệt XMLQUERY() là một hàm vô hướng và một phần của một câu lệnh SELECT; nó chỉ trả về một giá trị cho mỗi cuộc gọi (có nghĩa là, cho mỗi tài liệu XML được chuyển tới nó) Nếu có nhiều mục trong một tài liệu XML, XMLQUERY() phải