Mã tổ hợp sẽ dễ dàng hơn trong việc chuyển đổi chữ hoa/chữ thường, trong một số ứng dụng có thể dùng luôn tính năng Change Case có sẵn để chuyển đổi chữ hoa/chữ thường.. Các kết luận này
Trang 1qwertyuiopasdfghjklzxcvbnmqwert yuiopasdfghjklzxcvbnmqwertyuiop asdfghjklzxcvbnmqwertyuiopasdfg hjklzxcvbnmqwertyuiopasdfghjklzx cvbnmqwertyuiopasdfghjklzxcvbn mqwertyuiopasdfghjklzxcvbnmqwe rtyuiopasdfghjklzxcvbnmqwertyuio pasdfghjklzxcvbnmqwertyuiopasdf ghjklzxcvbnmqwertyuiopasdfghjklz xcvbnmqwertyuiopasdfghjklzxcvbn mqwertyuiopasdfghjklzxcvbnmqwe rtyuiopasdfghjklzxcvbnmqwertyuio pasdfghjklzxcvbnmqwertyuiopasdf ghjklzxcvbnmqwertyuiopasdfghjklz xcvbnmqwertyuiopasdfghjklzxcvbn mrtyuiopasdfghjklzxcvbnmqwertyu
BÁO CÁO ĐỒ ÁN MÔN HỌC TRUY XUẤT CHUỖI UNICODE TRONG SQL
SERVER TỪ JAVA VÀ PHP
3/19/2008
Vũ Minh Quang - Tô Duy Liêm
Trang 2BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC MỞ THÀNH PHỐ HỒ CHÍ MINH
KHOA CÔNG NGHỆ THÔNG TIN -
BÁO CÁO ĐỒ ÁN MÔN HỌC
Trang 3Nội dung đề tài
1 Tên đề tài: Truy xuất chuỗi Unicode trong SQL Server từ Java và PHP
- Hiện thực demo giải pháp
3 Giáo viên hướng dẫn: thầy Thạc sỹ Nguyễn Văn Hiệp
4 Thời gian hoàn thành: 25/11/2007 - 19/03/2008
5 Sinh viên thực hiện: Tô Duy Liêm, Nguyễn Minh Quang
6 Công nghệ yêu cầu:
- Window 2000, XP, Vista, Linux
- Microsoft SQL Server 2000 or newer
- Apache web service
- PHP 4.0 or newer
- Java flatform
7 Công cụ hiện thực demo:
- Window XP SP2 OS
- Microsoft SQL Server 2000 Service Pack 2
- AppServ phiên bản Win32 version 2.5.9, bao gồm:
Trang 4MỤC LỤC
• Phần mục lục 4
• Unicode 5
• SQL Server, PHP và Java 13
• Các phương pháp truy xuất SQL Server từ PHP và Java 15
• Các phương pháp truy xuất chuỗi Unicode từ SQL Server với PHP và Java 52
• Phần phụ lục 62
• Nhận xét của giáo viên hướng dẫn 63
• Nhận xét của trưởng khoa CNTT trường ĐH Mở 64
• Lời kết 65
Trang 5I Unicode
Phần 1: Tổng quan về Unicode
a) Unicode: là bộ mã chuẩn quốc tế được thiết kế để dùng làm bộ mã duy
nhất cho tất cả các ngôn ngữ khác nhau trên thế giới, kể cả các ngôn ngữ sử dụng ký
tự tượng hình phức tạp như tiếng Trung Quốc, tiếng Thái, v.v Vì những điểm ưu việt
đó, Unicode đã và đang từng bước thay thế các bộ mã truyền thống, kể cả bộ mã tiêu chuẩn ISO 8859 và hiện đang được hỗ trợ trên rất nhiều phần mềm cũng như các trình ứng dụng, chẳng hạn Windows
b) Hiệp hội Unicode:
Hiệp hội Unicode ở California xuất bản phiên bản đầu tiên của The Unicode Standard (Tiêu chuẩn Unicode) vào năm 1991, và vẫn liên tục hoàn thiện chuẩn (hiện nay đã đến phiên bản 4.0) Các phiên bản mới được viết dựa trên các phiên bản đã
có, nhờ vậy đảm bảo được tính tương thích Lưu ý Unicode và tiêu chuẩn ISO 10646
là hai khái niệm hoàn toàn độc lập Khi nói đến ISO 10646 tức là người ta đang nói đến tiêu chuẩn quốc tế chính thức, còn Unicode thì được Unicode Consortium (tập hợp đại diện các công ty tin học lớn) soạn ra Kể từ năm 1991, khi Nhóm làm việc ISO và Liên đoàn Unicode quyết định hợp tác chặt chẽ với nhau trong quá trình nâng cấp và mở rộng chuẩn để đảm bảo tính tương thích (cụ thể là vị trí của các ký tự trên
cả hai đều y hệt nhau – chẳng hạn chữ ơ là 01A1) Còn với Unicode thì lại khác, chuẩn này được phát triển bởi Liên đoàn Unicode Liên đoàn Unicode là một tổ chức phi lợi nhuận tập hợp bởi một số công ty, trong đó có cả những công ty đa quốc gia khổng lồ có ảnh hưởng lớn như Microsoft, Adobe Systems, IBM, Novell, Sun Microsystems, Lotus Software, Symantec và Unisys Tuy nhiên, chuẩn Unicode không chỉ quy định bộ mã, mà còn cả cách dựng hình, cách mã hóa
c) Kho chữ:
Unicode chiếm trước 1.114.112 (= 220+216) mã chữ, và hiện nay đã gán ký hiệu cho hơn 96000 mã chữ 256 mã đầu tiên phù hợp với ISO 8859-1, là cách mã hóa ký tự phổ biến nhất trong "thế giới phương Tây"; do đó, 128 ký tự đầu tiên còn được định danh theo ASCII
Không gian mã Unicode cho các ký tự được chia thành 17 mặt phẳng (plane)
và mỗi mặt phẳng có 65536 code point Mặt phẳng đầu tiên (plane 0), "Mặt phẳng đa ngôn ngữ căn bản" (Basic Multilingual Plane - BMP), là nơi mà đa số các ký hiệu được gán mã BMP chứa các ký hiệu cho hầu hết các ngôn ngữ hiện đại, và một số lượng lớn các ký tự đặc biệt Đa số các code point được phân bố trong BMP được dùng để mã hóa các ngôn ngữ CJKV (Hán-Nhật-Hàn-Việt)
Hai mặt phẳng tiếp theo được dùng cho các ký tự "đồ họa" Mặt phẳng 1,
"Mặt phẳng đa ngôn ngữ bổ sung" (Supplementary Multilingual Plane - SMP), được
Trang 6dùng chủ yếu cho các loại chữ viết cổ, ví dụ Egyptian hieroglyph (chưa được mã hóa), nhưng cũng còn được dùng cho các ký hiệu âm nhạc Mặt phẳng 2, (Supplementary Ideographic Plane - SIP), được dùng cho khoảng 40000 chữ Trung Quốc ít gặp mà đa số là các ký hiệu cổ, ngoài ra cũng có một số ký hiệu hiện đại Mặt phẳng 14 hiện chứa một số các ký tự thẻ ngôn ngữ không được khuyến khích và một số ký hiệu lựa chọn biến thể Mặt phẳng 15 và Mặt phẳng 16 được mở cho các
sử dụng cá nhân
Kho ≈220 điểm mã bảo đảm sự tương thích với bộ mã UTF-16 Việc mới chỉ dùng hết có 10% kho chữ cho thấy rằng kho chữ cỡ ≈20 bit này khó bị đầy trong một tương lai gần
Các chương trình 8-bit cũ chỉ nhận biết các ký tự 8 bit, và không thể dùng nhiều hơn 256 điểm mã nếu không có những cách giải quyết đặc biệt Do đó người ta phải đề ra nhiều cơ chế để dùng Unicode; tùy thuộc vào khả năng lưu trữ, sự tương thích với chương trình nguồn và sự tương tác với các hệ thống khác mà mỗi người chọn một cơ chế
1 UTF-32
Cách đơn giản nhất để lưu trữ tất cả các 220+216 Unicode code points là sử dụng 32 bit cho mỗi ký tự, nghĩa là, 4 byte – do đó, cách mã hóa này được Unicode gọi là UTF-32 và ISO/IEC 10646 gọi là UCS-4 Vấn đề chính của cách này là nó hao chỗ hơn 4 lần so với trước kia, do đó nó ít được dùng trong các vật nhớ ngoài (như đĩa, băng) Tuy nhiên, nó rất đơn giản, nên một số chương trình sẽ sử dụng mã hóa
32 bit bên trong khi xử lý Unicode
Những ký hiệu không nằm trong BMP đuợc biểu diễn bằng cách dùng surrogate pair (cặp thay thế) Code points có giá trị từ U+D800 đến U+DFFF được dành riêng ra để dùng cho mục đích nầy Trước hết, một code point có 20 bit được phân ra làm hai nhóm 10 bit Nhóm Most Significant 10 bit đuợc map vào một giá trị
10 bit nằm trong khoảng từ u+D800 đến u+DBFF Nhóm Least Significant 10 bit đuợc map vào một giá trị 10 bit nằm trong khoảng từ U+DC00 đến U+DFFF Theo cách đó UTF-16 có thể biểu diễn được những ký hiệu Unicode có 20 bit
Trang 73 UTF-8
8 là một cách mã hóa để có tác dụng giống như UCS-4 (cũng là 16), chớ không phải có code point nào khác UTF-8 được thiết kế để tương thích với chuẩn ASCII UTF-8 có thể sử dụng từ một (cho những ký tự trong ASCII) cho đến
UTF-6 byte để biểu diễn một ký tự
Chính vì tương thích với ASCII, UTF-8 cực kỳ có lợi thế khi được sử dụng
để bổ sung hỗ trợ Unicode cho các phần mềm có sẵn Thêm vào đó, các nhà phát triển phần mềm vẫn có thể sử dụng các hàm thư viện có sẵn của ngôn ngữ lập trình C
để so sánh (comparisons) và xếp thứ tự (Ngược lại, để hỗ trợ các cách mã hóa 16 bit hay 32 bit như ở trên, một số lớn phần mềm buộc phải viết lại do đó tốn rất nhiều công sức Một điểm mạnh nữa của UTF-8 là với các văn bản chỉ có một số ít các ký
tự ngoài ASCII, hay thậm chí cho các ngôn ngữ dùng bảng chữ cái Latinh như tiếng Việt, tiếng Pháp, tiếng Tây Ban Nha, v.v.; cách mã hóa kiểu này cực kỳ tiết kiệm không gian lưu trữ
UTF-8 được thiết kế đảm bảo không có chuỗi byte của ký tự nào lại nằm trong một chuỗi của ký tự khác dài hơn Điều này khiến cho việc tìm kiếm ký tự theo byte trong một văn bản là rất dễ dàng Một số dạng mã hóa khác (như Shift-JIS) không có tính chất này khiến cho việc xử lý chuỗi ký tự trở nên phức tạp hơn nhiều Mặc dù để thực hiện điều này đòi hỏi phải có độ dư (văn bản sẽ dài thêm) nhưng những ưu điểm mà nó mang lại vẫn nhiều hơn Việc nén dữ liệu không phải là mục đích hướng tới của Unicode và việc này cần được tiến hành một cách độc lập
Các quy định chính xác của UTF-8 như sau (các số bắt đầu bằng 0x là các số biểu diễn trong hệ thập lục phân)
Các ký tự có giá trị nhỏ hơn 0x80, sử dụng 1 byte có cùng giá trị
Các ký tự có giá trị nhỏ hơn 0x800, sử dụng 2 byte: byte thứ nhất có giá trị 0xC0 cộng với 6 bit từ thứ 7 tới 11 (7th-11th least significant bits); byte thứ hai có giá trị 0x80 cộng với các bit từ thứ 1 tới thứ 6 (1st-6th least significant bits)
Các ký tự có giá trị nhỏ hơn 0x10000, sử dụng 3 byte: byte thứ nhất có giá trị 0xE0 cộng với 4 bit từ thứ 13 tới 16; byte thứ hai có giá trị 0x80 cộng với 6 bit từ thứ
7 tới 12; byte thứ ba có giá trị 0x80 cộng với 6 bit từ thứ 1 tới thứ 6
Các ký tự có giá trị nhỏ hơn 0x20000, sử dụng 4 byte: byte thứ nhất có giá trị 0xF0 cộng với 3 bit từ thứ 19 tới 21; byte thứ hai có giá trị 0x80 cộng với 6 bit từ thứ
13 tới 18; byte thứ ba có giá trị 0x80 cộng với 6 bit từ thứ 7 tới thứ 12; byte thứ tư có giá trị 0x80 cộng với 6 bit từ thứ 1 tới thứ 6
Hiện nay, các giá trị khác ngoài các giá trị trên đều chưa được sử dụng Tuy nhiên, các chuỗi ký tự dài tới 6 byte có thể được dùng trong tương lai
Trang 84 UTF-7
Chuẩn hóa được ít dùng nhất có lẽ là UTF-7 Chuẩn MIME yêu cầu mọi thư điện tử phải được gửi dưới dạng ASCII cho nên các thư điện tử nào sử dụng mã hóa Unicode được coi là không hợp lệ Tuy nhiên hạn chế này thường bị hầu hết mọi người bỏ qua UTF-8 cho phép thư điện tử sử dụng Unicode và đồng thời cũng phù hợp với tiêu chuẩn Các ký hiệu ASCII sẽ được giữ nguyên, tuy nhiên các ký tự khác ngoài 128 ký hiệu ASCII chuẩn sẽ được mã hóa bằng một escape sequence hay một dấu '+' theo sau một ký tự Unicode được mã hóa bằng Base64, và kết thúc bằng một dấu '-' Ký tự '+' nổi tiếng sẽ được mã hóa thành '+-'
e) Các vấn đề khác
Tiêu chuẩn Unicode còn bao gồm một số vấn đề có liên quan, chẳng hạn character properties, text normalisation forms và bidirectional display order (để hiển thị chính xác các văn bản chứa cả hai loại ngôn ngữ có cách viết từ phải qua trái như tiếng Ả Rập hay tiếng Hebrew) và trái qua phải
Phần 2: Unicode và chữ viết Việt Nam
Unicode và chữ viết Việt Nam, bộ mã TCVN 6909:2001
Có hai dòng giải pháp chính để xử lý tiếng Việt trong công nghệ thông tin là
mã dựng sẵn và mã tổ hợp Cả hai giải pháp đều có những ưu và nhược điểm riêng
và cũng là chủ đề gây nhiều tranh luận trong giới tin học trong thời gian gần đây
Ưu và nhược điểm của 2 loại mã tổ hợp và dựng sẵn:
a) Ưu điểm của mã tổ hợp
Mã tổ hợp có phần gọn nhẹ và chiếm ít mã hơn trong bảng mã, chỉ cần 20 mã cho ký tự thuần Việt ( ă, â, ê, ô, ơ, ư, Ă, Â, Ê, Ô, Ơ, Ư, các dấu thanh: huyền, hỏi, ngã, sắc, nặng và dấu tổ hợp nguyên âm: nón, mũ, râu cho dạng canonical) trong khi
đó mã dựng sẵn phải cần đến 134 mã cho ký tự thuần Việt
Mã tổ hợp có phần gần với ngôn ngữ tự nhiên (Việt) hơn trong quá trình ghép chữ, ghép vần
Trang 9Mã tổ hợp sẽ dễ dàng hơn trong việc chuyển đổi chữ hoa/chữ thường, trong một số ứng dụng có thể dùng luôn tính năng Change Case có sẵn để chuyển đổi chữ hoa/chữ thường
ra không phải như vậy, lý do là các dấu thanh huyền, sắc, ngã, hỏi, nặng - thứ tự trong bảng mã Unicode - lại nằm không đúng theo thứ tự sắp xếp tiếng Việt là huyền, hỏi, ngã, sắc, nặng, do đó vẫn phải thiết kế thuật toán riêng để sắp xếp mà không dùng ngay các hàm sắp xếp có sẵn trong tiếng Anh (đa phần các ứng dụng chỉ hỗ trợ sắp xếp theo luật tiếng Anh) Khi đã phải dùng thuật toán riêng thì việc sắp xếp cho
mã dựng sẵn cũng không khó hơn, không phức tạp nhiều hơn so với việc sắp xếp cho
mã tổ hợp
dụ tìm những chữ tiếng Việt gần với âm “tha” chẳng hạn thì các hàm tìm kiếm phổ thông sẽ tìm ra được các chữ thà, thá, thả, thã, thạ Nhưng nếu tìm những từ gần với
âm “than” thì lúc ấy lại phải thiết kế thuật toán riêng, mà khi đã phải dùng thuật toán riêng thì giữa tổ hợp và dựng sẵn thuật toán không khó hơn nhau nhiều
2000, và bộ MS Office 2000, ý tốt hơn ở đây là chuyển đổi chữ hoa/thường, sắp xếp tiếng Việt được thiết kế ngay trong hệ điều hành và trong một số ứng dụng Mã tổ hợp do các mã vẫn nằm trong miền W4L nên có thể hiện thị tốt hơn trong một số control có sẵn của Windows 2000, XP Tuy nhiên lên môi trường Windows XP, Microsoft đã hỗ trợ luôn cả mã dựng sẵn với tính năng sắp xếp tiếng Việt cũng được tích hợp vào trong hệ điều hành do đó trong môi trường Windows XP, Office XP thì
sự khác biệt về sự hỗ trợ tổ hợp và dựng sẵn cũng đã gần như nhau Vietkey Group
đã phối hợp với Microsoft Hà Nội tiến hành một loạt thí nghiệm trên các môi trường Windows và rút ra kết luận như vậy Các kết luận này không đúng cho các môi
b) Nhược điểm của bộ mã tổ hợp
hơn nhiều so với mã dựng sẵn, thông thường chỉ cài đặt được với font vector và bộ font cho phép định nghĩa các ký tự có độ rộng âm, khi đó 2 ký tự có độ rộng âm và dương tổ hợp lại sẽ cho ra ký tự cần hiển thị Một khó khăn khá lớn nữa là đa phần các công nghệ font phổ biến ngày nay như TrueType, OpenType, Type1 không cho phép thay đổi động vị trí các nét trong hình chữ, mà điều này lại rất cần thiết Ví dụ chữ “à”, và “À”, thì vị trí của dấu huyền phải nằm ở 2 cao độ khác nhau tuỳ theo chữ cái cơ sở là chữ thường hay chữ hoa, việc thay đổi động cao độ của dấu thanh theo ngữ cảnh là chưa thực hiện được bằng kỹ thuật Font chữ hiện hành Để khắc phục vấn đề này, VNI đã phải đề xuất 2 mã riêng cho từng dấu thanh: 2 dấu huyền, một
mã cho chữ hoa và một mã cho chữ thường Trong CP 1258 và Unicode để đảm bảo tính đơn trị (tính một-một) các dấu thanh chỉ có một mã vì thế sẽ rất khó khăn trong việc hiển thị Phương án thứ 2 mà Microsoft đưa ra để giải quyết vấn đề tăng giảm
độ cao dấu thanh là dùng kỹ thuật Hook API thay đổi các hàm Display qua đó ánh xạ
(Map) chuỗi ký tự tổ hợp về chuỗi ký tự dựng sẵn để hiển thị và in ấn Cơ chế này
Trang 10chỉ có trong Windows 95 tiếng Việt, Windows 2000, Windows XP mà không có trong Windows 95, Windows 98 Thêm nữa cơ chế này không phải bao giờ cũng thực hiện tốt, ngay cả trên Windows XP (mới nhất), hiện tượng xa rời dấu vẫn xẩy ra với MS Office 2000 (xem hình minh họa ở phần dưới với PowerPoint 2000 trên XP)
Từ việc cài đặt mã tổ hợp phức tạp như vậy dẫn đến một nhược điểm thứ hai khá nghiêm trọng đó là tính tương thích của mã tổ hợp kém hơn Có nghĩa là một văn bản gõ bằng mã tổ hợp ở môi trường này thì có thể sẽ không đọc được trong môi trường khác Nhất là trong các môi trường dùng font ma trận (bitmap) thường dùng
để làm font hệ thống thì hầu như không thể cài đặt được mã tổ hợp Các môi trường như Dos, text console trong nhiều môi trường Unix, Linux cũng không thể cài được
mã tổ hợp Mã tổ hợp cài đặt trên các hệ điều hành phổ biến hiện nay là Windows 98 thì chữ rất xấu (xem hình minh họa) không thể chấp nhận được (thua xa VNI và ABC), sẽ là một vấn đề lớn khi dùng mã tổ hợp phải nâng cấp phần cứng máy tính lên để cài đặt các hệ Windows 2000, XP (theo khuyến cáo của Microsoft để chạy mã
tổ hợp tốt hơn), như vậy sẽ cần một kinh phí rất lớn để nâng cấp máy tính, cài đặt lại
hệ điều hành, rồi đào tạo lại
Độ mỹ thuật của mã tổ hợp thường kém hơn nhiều so với mã dựng sẵn, lý do
là một ký tự dấu thanh (có vị trí và cao độ xác định trong font chữ) thường được dùng chung cho nhiều nguyên âm khác nhau và chúng được tổ hợp tự động sau khi nhập đoạn text Vị trí của dấu thanh có thể hợp và đẹp với nguyên âm này nhưng lại
có thể không phù hợp với nguyên âm khác Ví dụ độ rộng của nguyên âm A thì khác với độ rộng của nguyên âm I (độ rộng rất hẹp) vì thế nếu đẹp cho chữ A thì xấu cho chữ I và ngược lại, để khắc phục tình trạng này VNI phải định nghĩa riêng các mã cho các chữ ì, í, ỉ, ĩ, ị Vì vậy chúng ta thường coi VNI là giải pháp khắc phục tình thế hơn là một bộ mã, vì nó không đảm bảo tính đơn trị, và nhất quán (có nhiều mã cho một dấu – với chữ i lại có xử lý khác so với xử lý các nguyên âm khác) Trong khi đó mã dựng sẵn được thiết kế từ trước (dựng sẵn) nên có thể bố trí vị trí dấu thanh ở vào vị trí thích hợp nhất cho từng nguyên âm, nên bao giờ cũng có khả năng đẹp hơn nhiều so với mã dựng sẵn tổ hợp
Xử lý hiệu ứng với đoạn mã tổ hợp có nhiều vấn đề khó khăn hơn so với mã dựng sẵn Trong nhiều trường hợp, một con chữ tiếng Việt trong lưu trữ và hiển thị với mã dựng sẵn lại không phải là một thể thống nhất (tổ hợp từ những ký tự rời rạc) cho nên khi thực hiện các hiệu ứng với đoạn văn bản như co dãn text, xoay, dồn chữ, canh đều hai bên thì các dấu và chữ thường bị tách rời nhau, chữ đi một nơi và dấu
đi một nơi, ảnh hưởng đến mỹ thuật và độ chính xác Có thể thường thấy trên các tít báo dùng font chữ VNI hay xuất hiện các hiện tượng xa rời dâu thanh
Xử lý với các ký tự mã tổ hợp phức tạp hơn so với mã dựng sẵn, do mỗi chữ cái trong mã tổ hợp có độ rộng thay đổi, lúc có thể là một ký tự, lúc khác lại được tổ hợp từ nhiều byte khác nhau Khi tách từ, tách ký tự (theo ngôn ngữ tự nhiên), thường dùng để phân tích cú pháp hay đánh chỉ số phải xây dựng thuật toán riêng khá phức tạp, trong khi mã dựng sẵn có độ rộng cố định nên việc rút ký tự từ đoạn text ra rất đơn giản, không cần xây dựng thuật toán riêng Ngoài ra việc các xử lý ký
tự khác như: xóa ký tự, di chuyển cho trỏ đi theo đơn vị ký tự thì thực hiện với mã tổ hợp khó khăn và phức tạp hơn nhiều: thường phải xóa 2 lần, cho một chữ, di chuyển
2 lần con trỏ mới đi ra khỏi một chữ, những điều này là xa lạ với ngôn ngữ tự nhiên
Trang 11Kích thước các tệp dữ liệu lưu ở dạng tổ hợp thường lớn hơn so với mã dựng sẵn khoảng 25-30%, do đó nó chiếm nhiều không gian trong đĩa cứng, bộ nhớ hơn,
và trên đường truyền mạng (internet/intranet) ngốn nhiều băng thông hơn
phức tạp hơn, vì mặc dù biết trước số chữ cái max nhưng lại khó đoán nhận chính xác độ dài chuỗi byte tương ứng lớn nhất, nếu thiết kế không khéo sẽ bị tràn bộ nhớ
Và khó khăn trong việc phân tách ký tự, phân tách từ cũng làm khó khăn thêm trong việc xử lý text trong lĩnh vực cơ sở dữ liệu
Trong lĩnh vực đánh chỉ số (index), và tìm kiếm toàn văn (Full Text Search),
mã tổ hợp cũng gây nhiều khó khăn hơn (phân tách từ, phân tách ký tự) và các ký tự dấu thanh trong mã tổ hợp thường bị coi là dấu phân cách từ, dẫn đến việc đánh index bị sai và tìm kiếm toàn văn cũng không đúng Hiện tượng này thường gặp với
đa số các bộ search engine, các công cụ tìm kiếm toàn văn trong Oracle và Lotus Notes 5.0 đều bị lỗi đánh chỉ số sai Tuy rằng Oracle và Lotus Notes đều hỗ trợ Unicode trong phần Encoding, nhưng đáng tiếc phần Full Text Search mua lại của hãng thứ 3 INSO (do Oracle sử dụng) và Verity (do Lotus Notes sử dụng) đều thực hiện các phân cách từ sai đối với mã tổ hợp Các lỗi này lại không xuất hiện với mã dựng sẵn
Nam cũng như ở nước ngoài, Unicode dựng sẵn được dùng rất phổ biến, các website của Việt Nam như VnExpress và Vasc Orient hàng ngày có gần 2 triệu lượt truy nhập chứng tỏ số lượng người dùng mã dựng sẵn rất lớn, trong khi các website dùng
mã tổ hợp rất ít Cho nên nếu chuyển sang tổ hợp sẽ phải chuyển một khối kượng không nhỏ các mã dựng sẵn sang tổ hợp
c) Ưu và nhược điểm của mã dựng sẵn
Những ưu và nhược điểm của mã dựng sẵn cũng đã được phân tích khá kỹ và song song trong quá trình phân tích các ưu và nhược điểm của mã tổ hợp
Tổng kết lại một cách tóm tắt: mã dựng sẵn không bị những nhược điểm của
mã tổ hợp, các file sử dụng mã dựng sẵn tốn ít không gian hơn, cài đặt đơn giản hơn, chữ hiển thị đẹp hơn, mỹ thuật hơn, xử lý với xâu ký tự dựng sẵn dễ dàng hơn (phân tách từ, phân tách ký tự, xóa và di chuyển con trỏ), chữ và dấu là một khối thống nhất nên khi co dãn text không bị hiện tượng xa rời dấu thanh, và đặc biệt tính tương thích của mã dựng sẵn cao hơn có thể chạy được trên nhiều môi trường khác nhau (từ font vector đến bitmap, từ Windows, MacIntosh đến Linux), vì chuyển mang văn bản
dữ liệu giữa các môi trường không đồng nhất (MultiPlatform) là một điều cũng rất cần thiết
Tất cả những ưu điểm của mã tổ hợp, thì lại không phải là căn bản và đều có thể giải quyết được tương đối khá dễ dàng, trong khi đó mã tổ hợp có những vấn đề
về kỹ thuật khá phức tạp (vấn đề cài đặt, hiển thị ) Vẫn biết kỹ thuật phải theo chuẩn, nhưng tại thời điểm hiện nay có những giới hạn nhất định về kỹ thuật và công nghệ, ví dụ cách đây 30 năm, mã hóa 8 bit là giới hạn chưa giải quyết được do không gian nhớ eo hẹp ngày nay cài đặt mã tổ hợp trong nhiều môi trường chưa thể làm
Trang 12được hoặc phải làm rất khó khăn và đi vòng vo như map từ tổ hợp về dựng sẵn Các nhược điểm của mã tổ hợp có thể khắc phục được một phần ở thời điểm hiện nay và
có thể khắc phục hoàn toàn trong tương lai
Microsoft chú ý hỗ trợ nhiều Microsoft trong thời gian trước có thiên hướng đi theo
mã tổ hợp (là phần nâng cấp từ mã 8-Bit CP1258 lên) Những xử lý về tiếng Việt như sắp xếp, chuyển đổi chữ hoa/thường được tích hợp luôn vào hệ điều hành như thế tốt hơn so với mã dựng sẵn, nhưng điều này chỉ đúng với Windows 2000 (không đúng với Windows 95,98), ngoài ra trên Windows XP, Microsoft đã bắt đầu hỗ trợ thêm mã dựng sẵn vào trong hệ điều hành: phần sắp xếp tiếng Việt và việc trong tương lai Microsoft hỗ trợ hoàn toàn mã dựng sẵn vào hệ điều hành không phải là vấn đề phức tạp về kỹ thuật có thể tiến hành rất nhanh Thêm nữa hiện đã có những
hỗ trợ tiếng Việt ở mức thấp API (giống như Windows) do các đơn vị ở trong nước thực hiện và đáp ứng đầy đủ các yêu cầu về xử lý tiếng Việt ở tầng thấp Vietkey Group đã xây dựng bộ thư viện Vietkey API cho phép xử lý hầu hết các vấn đề về tiếng Việt: tìm kiếm, sắp xếp, chuyển đổi chữ hoa, chữ thường, chuyển mã, và cả kiểm tra chính tả tiếng Việt ở mức hệ thống, có thể nhúng trong rất nhiều ứng dụng
và các công cụ lập trình trong môi trường Windows Vietkey API xử lý tiếng Việt ở một số góc cạnh còn đầy đủ và hoàn hảo hơn những hộ trợ từ mức hệ điều hành của Windows
trước mắt cũng như lâu dài và có thể sử dụng trong nhiều lĩnh vực: chế bản văn phòng, web, email, cơ sở dữ liệu và nhiều lĩnh vực khác
d) Bàn thêm về Unicode và TCVN 6909
Trước tiên cần phải nêu rõ mối quan hệ giữa Unicode và TCVN 6909 TCVN
6909 là một tập con của Unicode, nhưng đã được chọn lọc kỹ lưỡng để lấy ra đúng những ký tự sẽ dùng trong ngôn ngữ Việt TCVN 6909 quy định rõ ràng hơn và tính đơn trị một-một cao hơn trong Unicode TCVN 6909 chứa tất cả các ký tự dựng sẵn
và cũng có đầy đủ các mã để hiển thị cho dấu thanh, mã cho việc biểu diễn các dấu tổ hợp nguyên âm, như vậy TCVN 6909 là bộ mã rất đầy đủ (trong đó có mã cho tất cả các thành phần cấu thành tiếng Việt) TCVN 6909 không quy định các biểu diễn dựng sẵn hay tổ hợp Vì vậy nói TCVN 6909 là mã dựng sẵn là không chính xác
TCVN 6909 kế thừa các ưu điểm của bộ mã Unicode và ISO 10646, cho nên
nó hoàn toàn cho phép hội nhập tiếng Việt với các ngôn ngữ khác trong cộng đồng Unicode Hiện nay đa số các ứng dụng phổ thông đều đã hỗ trợ Unicode: Phần mềm văn phòng, cơ sở dữ liệu, Web, Email tuy nhiên cũng còn một số các phần mềm chuyên ngành chưa hỗ trợ Unicode
Vấn đề kỹ thuật của Unicode không chỉ là vấn đề bộ gõ Unicode (như một số chuyên gia đã lầm tưởng) mà là một loạt các vấn đề khác đặc biệt là các công cụ chuyển mã cho văn bản, dữ liệu (MS Office, Web pages, Database ) vấn đề chuyển
mã là vấn đề lớn hơn nhiều, vì khối lượng dữ liệu cần chuyển đổi sang Unicode rất lớn, lại rất đa dạng về khuôn dạng, loại hình, chủng loại Cần phải có các công cụ mạnh để chuyển đổi nhanh nhất, tốt ít thời gian, công sức nhiều nhất Ngoài ra còn các vấn đề sắp xếp, chuyển đổi chữ hoa, chữ thường, tìm kiếm toàn văn, kiểm tra
Trang 13chính tả tiếng Việt, đặc biệt các hỗ trợ ở mức lập trình cho các công cụ phát triển cũng là điều rất cần thiết (hiển thị, lưu trữ )
Về hỗ trợ tiếng Việt ở mức hệ thống, Vietkey Group còn có bộ thư viện Vietkey API cho phép xử lý các vấn đề tiếng Việt như so sánh xâu ký tự Việt, chuyển đổi chữ hoa/thường, sắp xếp tiếng Việt, chuyển mã và kiểm tra chính tả tiếng Việt, các công cụ này có thể nhúng được trong rất nhiều ứng dụng và các công cụ lập trình: Visual C, Basic, Delphi, Access, SQL Server
II SQL Server, PHP và Java
1) SQL Server 2000
SQL Server 2000 là một hệ thống quản lý cơ sở dữ liệu (Relational Database
Management System (RDBMS) ) sử dụng Transact-SQL để trao đổi dữ liệu giữa
Client computer và SQL Server computer Một RDBMS bao gồm databases, database engine và các ứng dụng dùng để quản lý dữ liệu và các bộ phận khác nhau trong RDBMS
SQL Server 2000 được tối ưu để có thể chạy trên môi trường cơ sở dữ liệu rất lớn (Very Large Database Environment) lên đến Tera-Byte và có thể phục vụ cùng lúc cho hàng ngàn user SQL Server 2000 có thể kết hợp "ăn ý" với các server khác như Microsoft Internet Information Server (IIS), E-Commerce Server, Proxy Server
SQL Server có 7 editions:
• Enterprise : Chứa đầy đủ các đặc trưng của SQL Server và có thể chạy tốt
trên hệ thống lên đến 32 PUs và 64 GB RAM Thêm vào đó nó có các dịch
vụ giúp cho việc phân tích dữ liệu rất hiệu quả (Analysis Services)
• Standard : Rất thích hợp cho các công ty vừa và nhỏ vì giá thành rẻ hơn
nhiều so với Enterprise Edition, nhưng lại bị giới hạn một số chức năng
cao cấp (advanced features) khác, edition này có thể chạy tốt trên hệ thống
lên đến 4 CPU và 2 GB RAM
• Personal: được tối ưu hóa để chạy trên PC nên có thể cài đặt trên hầu
hết các phiên bản windows kể cả Windows 98
• Developer : Có đầy đủ các tính năng của Enterprise Edition nhưng được
chế tạo đặc biệt như giới hạn số lượng người kết nối vào Server cùng một
lúc
• Desktop Engine (MSDE): Ðây chỉ là một engine chạy trên desktop và
không có user interface (giao diện) Thích hợp cho việc triển khai ứng
dụng ở máy client Kích thước database bị giới hạn khoảng 2 GB
• Win CE : Dùng cho các ứng dụng chạy trên Windows CE
Trang 14• Trial: Có các tính năng của Enterprise Edition, download free, nhưng giới
hạn thời gian sử dụng
2) PHP
PHP (viết tắt hồi quy "PHP: Hypertext Preprocessor") là một ngôn ngữ lập trình kịch bản hay một loại mã lệnh chủ yếu được dùng để phát triển các ứng dụng viết cho máy chủ, mã nguồn mở, dùng cho mục đích tổng quát Nó rất thích hợp với web và có thể dễ dàng nhúng vào trang HTML Do được tối ưu hóa cho các ứng dụng web, tốc độ nhanh, nhỏ gọn, cú pháp giống C và Java, dễ học và thời gian xây dựng sản phẩm tương đối ngắn hơn so với các ngôn ngữ khác nên PHP đã nhanh chóng trở thành một ngôn ngữ lập trình web phổ biến nhất thế giới
3) Java
với phần lớn ngôn ngữ lập trình thông thường, thay vì biên dịch mã nguồn thành mã máy hoặc thông dịch mã nguồn khi chạy, Java được thiết kế để biên dịch mã nguồn thành bytecode, bytecode sau đó sẽ được môi trường thực thi (runtime environment) chạy Bằng cách này, Java thường chạy nhanh hơn những ngôn ngữ lập trình thông dịch khác như Python, Perl, PHP,
Cú pháp Java được vay mượn nhiều từ C & C++ nhưng có cú pháp hướng đối tượng đơn giản hơn và ít tính năng xử lý cấp thấp hơn
Java được tạo ra với tiêu chí "Viết (code) một lần, thực thi khắp nơi" ("Write Once, Run Anywhere" (WORA)) Chương trình phần mềm viết bằng Java có thể chạy trên mọi nền tảng (platform) khác nhau thông qua một môi trường thực thi với điều kiện có môi trường thực thi thích hợp hỗ trợ nền tảng đó Môi trường thực thi của Sun Microsystems hiện hỗ trợ Sun Solaris, Linux, Mac OS, FreeBSD & Windows Ngoài ra, một số công ty, tổ chức cũng như cá nhân khác cũng phát triển môi trường thực thi Java cho những hệ điều hành khác Trong đó đáng nói đến nhất
là IBM Java Platform hỗ trợ Windows, Linux, AIX & z/OS
Những chi tiết về ngôn ngữ, máy ảo và API của Java được giữ bởi Cộng đồng Java (do Sun quản lý) Java được tạo ra vào năm 1991 do một số kỹ sư ở Sun, bao gồm ông James Gosling, một phần của Dự án Xanh Java được phát hành vào năm
1994, rồi nó trở nên nổi tiếng khi Netscape tuyên bố tại hội thảo SunWorld năm 1995
là trình duyệt Navigator của họ sẽ hỗ trợ Java
Trang 15III Các phương pháp truy xuất SQL
- Yêu cầu cho Win32 platforms
qua file php_mssql.dll và không được bật sẵn Ta phải vào cấu hình lại trong file
php.ini bằng cách thêm vào dòng extension = php_mssql.dll
php.ini
- Các lựa chọn cấu hình cho MS SQL Server:
mssql.datetimeconvert "1" PHP_INI_ALL Available since PHP 4.2.0
mssql.secure_connection "0" PHP_INI_SYSTEM Available since PHP 4.3.0
Trang 16- Các hằng định nghĩa trước khi biên dịch (Predefined constants) và chỉ có hiệu lực thực thi khi biên dịch với PHP hoặc khi được nạp vào lúc chạy :
bool mssql_bind ( resource $stmt , string $param_name , mixed &$var , int
$type [, int $is_output [, int $is_null [, int $maxlen ]]] )
Chức năng:
Gán 1 thông số vào store procedure hoặc 1 remote store procedure
Các Thông số:
Stmt : tài nguyên khai báo, lấy được từ hàm mssql_init()
param_name: tên của thông số, thường là chuỗi
var: biến để gắn kết thông số vào Có thể truyền trị hoặc truyền tham số, để
nhận được giá trị OUTPUT và RETVAL sao khi thực thi execution
type: là 1 trong các dạng: SQLTEXT, SQLVARCHAR, SQLCHAR,
SQLINT1, SQLINT2, SQLINT4, SQLBIT, SQLFLT4, SQLFLT8,
SQLFLTN
- is_output: xét xem giá trị có là 1 thông số OUTPUT hay không Nếu là 1
input bình thường và sẽ không có error nào được thông báo
Trang 17is_null: xét xem Thông số có là NULL hay không Nếu truyền giá trị NULL
như var sẽ không có gì được thực hiện
maxlen: sử dụng với kiểu giá trị char/varchar Phải khai báo trước chiều dài
của dữ liệu để nếu Thông số có dạng varchar (50), thì kiểu phải là SQLVARCHAR
$sp = mssql_init("WDumpAdd"); // stored proc name
mssql_bind($sp, "@productname", stripslashes($newproduct), SQLVARCHAR,
sẽ đóng kết nối cuối cùng còn đang mở
Lưu ý: các liên kết không ổn định (nonpersistent) sẽ tự động đóng khi đoạn
mã lệnh được thực thi xong
Trang 18mssql_connect()
Cú pháp:
resource mssql_connect ([ string $servername [, string $username [, string
$password [, bool $new_link ]]]] )
Chức năng:
Mssql_connect() thiết đặt 1 kết nối đến MS SQL server Đối số tên của
server fải là 1 tên hợp lệ được định nghĩa trong file interfaces Kết nối đến server sẽ phải bị đóng ngay khi đoạn script thực thi xong, trừ khi nó đã được đóng trước đó
bởi việc gọi tường minh hàm mssql_close()
new_link: nếu gọi lệnh lần 2 với cùng tham số thì sẽ không có kết nối mới
nào được thiết lập mà sẽ lấy lại kết nối cũ đã được mở Thông số new_link bắt buộc
mỗi lần hàm khi được gọi phải mở ra 1 kết nối mới, cho dù đã được gọi trước đó với
cùng Thông số
Giá trị trả về: 1 kết nối thành công đến MS SQL server, hoặc FALSE nếu
thất bại hoặc có lỗi
Trang 19Lưu ý: sử dụng mssql_fetch_array() sẽ không làm tốn thời gian đáng kể so
với sử dụng mssql_fetch_row(), trong khi nó cung cấp phần thông tin thêm rất đáng
Lưu ý: Tên cột phân biệt chữ hoathường
Các cột rỗng sẽ được gán giá trị NULL của PHP
Trang 21Ví dụ:
<?php
$resDb = mssql_connect('localhost', 'user', 'name');
$result = mssql_query('SELECT * FROM MYTABLE', $resDb, 10000);
$intNumRows = mssql_num_rows($result);
while ($intNumRows > 0) { while ($arrRow = mssql_fetch_assoc($result)) {
.result : kết quả được lấy từ việc gọi lệnh mssql_query()
field_offset: vị trí offset của field Nếu vị trí offset không được chỉ định,
trường kế tiếp mà chưa được xác định bởi hàm sẽ được xác định Field_offset bắt
đầu từ 0
Kết quả trả về: trả về 1 đối tượng chứ thông tin về field
Thuộc tính của đối tượng này có thể là:
• Name: tên của cột Nếu cột là kết quả của 1 hàm, thuộc tính này được thiết lập cho giá trị tính toán trước #N, #N là giá trị tuần tự
• Column_source: tên của bảng chứa cột đó
• Max_length: chiều dài tối đa của cột
• Numeric: là 1 nếu cột là số
• Type: kiểu của cột
Trang 22thông qua tên của field, chứ không được truy cập thông qua offset của field
1 cách nào đó, hàm này có thể xem như hàm mssql_fetch_array(), và hầu như
là nhanh như hàm mssql_fetch_row() (sự khác biệt không đáng kể)
Thông số:
result : kết quả được lấy từ việc gọi lệnh mssql_query()
Kết quả trả về: trả về 1 đối tượng tương ứng với các hàng được trả về
mssql_fetch_row()
Cú pháp:
Mô tả: trả về các hàng như là 1 array
int mssql_field_length ( resource $result [, int $offset ] )
Mô tả: trả về chiều dài của 1 field
Thông số:
.result : kết quả được lấy từ việc gọi lệnh mssql_query()
.offset: offset của field, khởi đầu từ 0 Nếu bị bỏ qua, thì offset field hiện tại
sẽ được dùng
Kết quả trả về: chiều dài của field, hoặc FALSE nếu thất bại
Trang 23mssql_field_name()
Cú pháp:
string mssql_field_name ( resource $result [, int $offset ] )
Mô tả: trả về tên của field
Thông số:
.result : kết quả được lấy từ việc gọi lệnh mssql_query()
.offset: offset của field, khởi đầu từ 0 Nếu bị bỏ qua, thì offset field hiện tại
sẽ được dùng
Kết quả trả về: Tên của field được chỉ định, hoặc FALSE nếu thất bại
mssql_field_seek()
Cú pháp:
bool mssql_field_seek ( resource $result , int $field_offset )
Mô tả: tìm kiếm field offset đã được chỉ định trước Nếu lần gọi tiếp đến hàm
mssql_fetch_field() không bao gồm field offset, thì giá trị field này sẽ đc trả về
Thông số:
.result : kết quả được lấy từ việc gọi lệnh mssql_query()
field_offset: offset của field, khởi đầu từ 0
Kết quả trả về: TRUE nếu tìm thấy hoặc FALSE nếu thất bại
mssql_field_type()
Cú pháp:
string mssql_field_type ( resource $result [, int $offset ] )
Mô tả: lấy kiểu của field
Thông số:
.result : kết quả được lấy từ việc gọi lệnh mssql_query()
field_offset: offset của field, khởi đầu từ 0
Kết quả trả về: Kiểu của field hoặc FALSE nếu thất bại
Trang 24mssql_free_result()
Cú pháp:
bool mssql_free_result ( resource $result )
Mô tả: mssql_free_result() được sử dụng khi có quá nhiều bộ nhớ bị chiếm
dụng khi thực thi script Mọi bộ nhớ sẽ được giải phóng khi thực thi xong Gọi mssql_free_result() với đối số chỉ định sẵn sẽ giải phóng bộ nhớ cho phần đối số đó
Thông số:
.result : kết quả được lấy từ việc gọi lệnh mssql_query()
Kết quả trả về: TRUE nếu thực hiện thành công hoặc FALSE nếu thất bại
mssql_free_statement()
Cú pháp:
Mô tả: giống như mssql_free_result() nhưng mà giải phóng bộ nhớ cho câu
lệnh
Thông số:
.stmt: nguồn truy xuất, thường lấy từ mssql_init()
Kết quả trả về: TRUE nếu thành công và FALSE nếu thất bại
mssql_get_last_message()
Cú pháp:
Mô tả: trả về thông điệp cuối từ server
mssql_guid_string()
Cú pháp:
string mssql_guid_string ( string $binary [, int $short_format ] )
Mô tả: Chuyển đổi 16byte binary GUID sang chuỗi
Trang 25mssql_init()
Cú pháp:
resource mssql_init ( string $sp_name [, resource $link_identifier ] )
Mô tả: khởi tạo 1 stored procedure hoặc 1 remote stored procedure
Thông số:
.sp_name : tên của store procedure
.link_identifier: liên kết MS SQL, trả về từ mssql_connect()
Kết quả trả về: Trả về 1 nguồn truy xuất từ SQL, sử dụng cho các lần gọi kế
như mssql_bind() và mssql_execute() hoặc FALSE khi thất bại
mssql_min_error_severity()
Cú pháp:
void mssql_min_error_severity ( int $severity )
Mô tả: Thiết lập các mức lỗi nghiêm trọng cho MS SQL
mssql_min_error_severity()
Cú pháp:
void mssql_min_message_severity ( int $severity )
Mô tả: Thiết lập các mức thông báo lỗi cho MS SQL
mssql_next_result()
Cú pháp:
bool mssql_next_result ( resource $result_id )
Mô tả: khi gửi nhiều hơn 1 lệnh SQL đến server hoặc thực thi 1 stored
procedure trả về nhiều kết quả, thì hàm này sẽ kiểm tra các kết quả trả về từ server Nếu kết quả lấy về từ server đã tồn tại thì nó sẽ được giải phóng và thay vào là kết
quả mới
Thông số:
.result_id : kết quả nguồn được lấy từ việc gọi lệnh mssql_query()
Kết quả trả về: TRUE nếu nguồn truy xuất từ server khả thi và FALSE trong
các trường hợp khác
Trang 26Mô tả: trả về số field trong kết quả truy xuất từ server
Thông số:
.result: kết quả nguồn truy xuất được lấy từ việc gọi lệnh mssql_query()
Kết quả trả về: số lượng của field, dưới kiểu integer
mssql_num_rows()
Cú pháp:
Mô tả: trả về số hàng trong kết quả truy xuất từ SQL
Thông số:
.result: kết quả nguồn truy xuất được lấy từ việc gọi lệnh mssql_query()
Kết quả trả về: số lượng của field, dưới kiểu integer
Trang 27mssql_pconnect()
Cú pháp:
resource mssql_pconnect ([ string $servername [, string $username [, string
$password [, bool $new_link ]]]] )
Mô tả: hoạt động tương tự như hàm mssql_connect(), nhưng có 2 điểm khác
biệt lớn
Thứ nhất, khi kết nối, hàm trước tiên sẽ tìm kiếm 1 kết nối (dạng persitent) đã
có kết nối sẵn với cùng host, username và password Nếu tìm thấy, hàm sẽ trả về kết nối đó thay vì mở ra 1 kết nối mới
Thứ nhì, kết nối đến SQL server sẽ không được đóng khi đã thực thi xong
script mà vẫn được giữ cho các lần sử dụng sau( lệnh mssql_close() sẽ không đóng kết nối được thiết lập bởi mssql_pconnect() )
new_link: nếu gọi lệnh lần 2 với cùng tham số thì sẽ không có kết nối mới
nào được thiết lập mà sẽ lấy lại kết nối cũ đã được mở Thông số new_link bắt buộc
mỗi lần hàm khi được gọi phải mở ra 1 kết nối mới, cho dù đã được gọi trước đó với cùng thông số
Giá trị trả về: 1 kết nối thành công đến MS SQL server, hoặc FALSE nếu
thất bại hoặc có lỗi
.query: 1 câu query SQL
.link_identifier: 1 kết nối định danh MS SQL, là kết quả trả về từ
mssql_connect() hoặc mssql_pconnect() Nếu không xác định kết nối, đường kết nối
Trang 28đang mở sẽ được sử dụng Nếu không có kết nối nào được mở, hàm sẽ cố gắng thiết lập 1 kết nối như thể mssql_connect() được gọi, và sử dụng nó
.batch_size: số record để nhóm lại trong bộ đệm
Kết quả trả về: kết quả truy xuất từ MS SQL, TRUE nếu không có hàng nào,
FALSE nếu gặp lỗi
Ghi chú: nếu query trả về nhiều giá trị thì cần thiết để nạp tất cả kết quả thông qua việc gọi mssql_next_result() hoặc giải phóng thông qua gọi mssql_free_result() trước khi thực thi query kế tiếp
mssql_result()
Cú pháp:
string mssql_result ( resource $result , int $row , mixed $field )
Mô tả: trả về nội dụng của 1 ô từ kết quả nguồn truy xuất từ MS SQL
Thông số:
.result: kết quả nguồn truy xuất được lấy từ việc gọi lệnh mssql_query()
.row: số hàng
tablename.fieldname Nếu tên của cột đã được đặt bí danh thì sẽ sử dụng bí danh này thay vì tên cột
Lưu ý: khai báo số offset của field thì sẽ nhanh hơn nhiều so với khai báo tên hay dạng tablename.fieldname
Kết quả trả về: nội dung của ô
mssql_rows_affected()
Cú pháp:
int mssql_rows_affected ( resource $link_identifier )
Mô tả: trả về số record ảnh hưởng bởi query
Thông số:
.link_identifier: liên kết MS SQL, trả về từ mssql_connect() hay
mssql_pconnect()
Trang 29mssql_select_db()
Cú pháp:
bool mssql_select_db ( string $database_name [, resource
link_identifier ] )
Mô tả: thiết đặt database sẽ kết nối tới trên server Những lần gọi sau đến
mssql_query() sẽ được thực hiện trên database này
Thông số:
.link_identifier: 1 kết nối định danh MS SQL, là kết quả trả về từ
mssql_connect() hoặc mssql_pconnect() Nếu không xác định kết nối, đường kết nối đang mở sẽ được sử dụng Nếu không có kết nối nào được mở, hàm sẽ cố gắng thiết lập 1 kết nối như thể mssql_connect() được gọi, và sử dụng nó
Kết quả trả về: TRUE nếu thành công hoặc FALSE nếu thất bại
Ví dụ:
<?php
$conn = mssql_connect('MYSQLSERVER', 'sa', 'password');
mssql_select_db('[my database]', $conn);
ODBC là một Database API chuẩn, nó cung cấp cho các bạn khả năng truy nhập đến các CSDL một cách độc lập với các DBMS, qua ODBC các bạn có thể truy xuất được tới các CSDL trên các DBMS khác nhau
Các đặc điểm của ODBC:
+ ODBC là một giao diện lập trình sử dụng SQL: ODBC sẽ sử dụng các lệnh SQL để truy xuất các CSDL
+ ODBC tách các nhà phát triển ứng dụng khỏi sự phức tạp của việc kết nối tới một nguồn dữ liệu: Mục tiêu chính được đề cho ODBC là nó phải
dễ dàng cho người lập trình ứng dụng có thể tạo ra các kết nối của người sử
Trang 30dụng cuối tới nguồn dữ liệu thích hợp mà không phải trở thành một chuyên gia về mạng
nguồn dữ liệu
+ ODBC cung cấp một mô hình lập trình "thích ứng" (adaptive): ODBC cung cấp các chức năng mà nó có thể được sử dụng với tất cả các DBMS trong khi vẫn cho phép một ứng dụng khai thác các khả năng riêng của mỗi DBMS Nó cung cấp các interrogation function mà một ứng dụng có thể chủ động sử dụng để xác định các khả năng của một DBMS Các interrogation function cho phép một ứng dụng hỏi một driver về một vài chức năng đặc biệt có được cung cấp trong một DBMS nào đó hay không
Kiến trúc của ODBC:
1 ODBC được xây dựng trên mô hình kiến trúc Client/Server
Trong kiến trúc Client/Server bao gồm một một client, một server, và một data protocol mà nó cho phép client và server giao tiếp với nhau Mô hình này rất lý tưởng cho một Traditional Relational DBMS, trong đó một mạng vật lý kết nối client
PC tới DBMS ở trên một máy khác ODBC được thiết kế để sử dụng với các hệ thống nằm trong mô hình kiến trúc client/server, đáp ứng được các yêu cầu cần thiết cho các Traditional Relational DBMS như:
+ Cung cấp một standard API
+ Khai thác tất cả các chức năng của bất cứ một DBMS nào
+ Cung cấp một sự thực thi tương đương với native API của bất cứ một
DBMS nào
Kiến trúc của ODBC đặt trên nền tảng mô hình kiến trúc client/server và sự đảm nhận cho bất cứ một giao diện lập trình nào cũng có thể phát và thu trên giao thức truyền dữ liệu của bất cứ một SQL DBMS, sẽ hoạt động và thực thi như native API cho DBMS đó
ODBC không chỉ giới hạn với các client/server DBMS, nó cũng làm việc với các desktop database và các fileoriented store như bảng tính và text
2 Các thành phần cơ bản trong kiến trúc của ODBC
File Oriented Data Store _Client/Server DBMS
Applications: Các ứng dụng đảm nhận việc tương tác với người sử dụng qua user
interface và gọi các ODBC function để đưa ra các câu lệnh SQL và nhận các kết quả trả về
Driver Manager: Như tên gọi của nó, nhiệm vụ của nó là quản lý sự tương
tác giữa các chương trình ứng dụng và các driver, nhiều ứng dụng và nhiều driver có thể được quản lý cùng một lúc
Trang 31Driver Manager cung cấp sự liên kết giữa các ứng dụng và các driver, cho phép nhiều ứng dụng truy xuất dữ liệu qua nhiều driver Driver Manager load hay unload một hoặc nhiều driver cho một hoặc nhiều ứng dụng Khi một ứng dụng cần truy xuất một nguồn dữ liệu, Driver Manager sẽ load đúng driver cần thiết Driver Manager xác định các ODBC function được cung cấp bởi driver đó và ghi các địa chỉ trong bộ nhớ của chúng vào một bảng
định vào gọi function đó Bằng cách này, nhiều driver có thể được quản lý đồng thời
và người lập trình ứng dụng không phải lo lắng đến việc quản lý chi tiết các từng driver Một ứng dụng có thể sử dụng ODBC tại cùng một thời điểm với một ứng dụng khác mà không cần phải biết đến ứng dụng này
Drivers: Các driver xử lý các ODBC function được gọi, đưa ra các yêu cầu
SQL để chỉ định các nguồn dữ liệu, và trả về kết quả cho các ứng dụng Các driver cũng đảm nhận việc tương tác với bất cứ các lớp phần mềm nào cần thiết để truy xuất nguồn dữ liệu
Data sources: Bao gồm các tập hợp dữ liệu và các môi trường tương ứng của
chúng, bao gồm các hệ điều hành, các DBMS, và các phần mềm mạng
Các lựa chọn cấu hình cho MS SQL Server:
Unified ODBC Configuration Options
Name Default Changeable Changelog
trong hàm odbc_connect() hay odbc_pconnect()
odbc_connect() hay odbc_pconnect()
odbc_connect() hay odbc_pconnect()
không
Trang 32Odbc.check_persistent boolean: kiểm tra tính khả dụng của 1 kết nối trước khi
được sử dụng lại
Odbc.max_persistent interger: số tối đa ODBC kết nối bền vững có thể
trong mỗi tiến trình
vững) có thể trong mỗi tiến trình
số byte trả về cho biến
Odbc.defaultbinmode integer: điều khiển dữ liệu nhị phân
Các hằng định nghĩa trước khi biên dịch (Predefined constants) và chỉ có
hiệu lực thực thi khi biên dịch với PHP hoặc khi được nạp vào lúc chạy :