Di chuyển một ứng dụng PHP từ MySQL sang DB2, Phần 3: Chuyển đổi mã PHP của bạn Giới thiệu về loạt bài này MySQL hiện là máy chủ cơ sở dữ liệu phổ biến nhất được sử dụng với ngôn ngữ lậ
Trang 1Di chuyển một ứng dụng PHP từ MySQL sang DB2,
Phần 3: Chuyển đổi mã PHP của bạn
Giới thiệu về loạt bài này
MySQL hiện là máy chủ cơ sở dữ liệu phổ biến nhất được sử dụng với ngôn ngữ lập trình PHP
để xây dựng các ứng dụng web động Tuy nhiên, DB2 là một cơ sở dữ liệu phổ biến khác được PHP hỗ trợ đầy đủ và cung cấp các lợi thế hấp dẫn hơn so với MySQL, làm cho nó trở thành một
sự lựa chọn lý tưởng cho nhiều ứng dụng
Loạt bài này mô tả tại sao việc di chuyển một ứng dụng PHP sang DB2 lại có ý nghĩa, cách chuẩn bị cho việc di trú, cách thực hiện nó, cách hỗ trợ nó, và cách xử lý các rủi ro tiềm năng dựa trên kinh nghiệm của các tác giả cho một cuộc di trú mới nhất Nhiều mẫu mã và mẫu cấu hình được cung cấp, cũng như các chỉ dẫn tài nguyên để giúp cho dự án chạy trơn tru
Với các ví dụ và các bài học thu được từ một việc chuyển đổi thực tế thành công, bạn sẽ thấy đây
có thể là một dự án đơn giản, có đủ tài liệu và cung cấp các lợi ích hấp dẫn
Loạt bài bốn phần này chia sẻ các bài học nhận được từ cuộc di trú MySQL-sang-DB2 thành công cho một ứng dụng mạng nội bộ PHP trọng yếu, cấp độ sản xuất, được 4.000 người dùng toàn cầu trong IBM sử dụng để hỗ trợ sản xuất nội dung cho ibm.com
Phần 1 mô tả các bước cần thực hiện để chuẩn bị cho việc di trú
Phần 2 mô tả các bước cần thực hiện để di trú cơ sở dữ liệu
Phần 3 mô tả các bước cần thực hiện để chuyển đổi mã PHP
Phần 4 mô tả các bước cần thực hiện để triển khai và hỗ trợ ứng dụng
Bạn sẽ học được những gì
Mục đích của loạt bài này là cho bạn hiểu những gì thường cần thiết để di trú một ứng dụng PHP
từ MySQL sang DB2, những tài nguyên nào có sẵn để trợ giúp bạn và một nhóm dự án của IBM
đã thực hiện nhiệm vụ này vào đầu năm 2010 như thế nào
Nếu bạn đã nghiên cứu một cuộc di trú từ MySQL sang DB2, bạn có thể đã thấy những giá trị
mà DB2 cung cấp dựa trên tài liệu sản phẩm, các đánh giá tiêu chuẩn về hiệu năng, các tính năng
mà bạn đã đọc trong tài liệu DB2, hoặc các so sánh trong các Sách Đỏ của IBM (IBM Redbooks
®) dành riêng cho nhiệm vụ này, bao gồm cuốn Hướng dẫn chuyển đổi MySQL sang DB2 (xem
Trang 2Loạt bài này cung cấp cho bạn một ví dụ cụ thể về cuộc di trú thực tế đã được thực hiện thành công như thế nào trong năm 2010 cho một ứng dụng mạng nội bộ PHP được sử dụng rất nhiều trong IBM để hỗ trợ quản lý nội dung hàng ngày được công bố trên nhiều phần của trang Web ibm.com
Sau khi bạn đọc xong loạt bài này, bạn sẽ có thể tạo một trường hợp di trú tương tự, hiểu được thời hạn và các phụ thuộc của các mục công việc cần được thực hiện, dự kiến các rủi ro tiềm năng, và biết nơi để tìm kiếm sự hỗ trợ từng bước trên đường đi Tất cả điều này sẽ cho bạn sự tự tin hơn để lựa chọn DB2 và sử dụng nó một cách tốt nhất cho các ứng dụng PHP của bạn hiện đang được phát triển trên MySQL
Những gì không trình bày
Loạt bài này nhằm chia sẻ các bài học thu được từ một cuộc di trú nội bộ IBM từ MySQL sang DB2 và cung cấp cho bạn thông tin về tài nguyên có sẵn để thực hiện một công cuộc tương tự Loạt bài này không phải là một hướng dẫn toàn diện về di trú để có thể áp dụng được cho tất cả các kịch bản
Để xác định một cách tiếp cận phù hợp với bạn, hãy tham khảo Hướng dẫn chuyển đổi MySQL
sang DB2 hoặc liên hệ với SMPO (Software Migration Project Office - Văn phòng dự án di trú
phần mềm) để đánh giá di trú miễn phí Các liên kết này được cung cấp trong phần Tài nguyên
Về đầu trang
Giới thiệu về việc di trú mã
Bài này trình bày năm bước làm việc chính trong một nghiên cứu chi tiết để thực hiện di trú mã ứng dụng PHP từ chỗ đang sử dụng các trình điều khiển và cú pháp MySQL tới chỗ làm việc với DB2 Nếu cần, hãy tham khảo Phần 1 của loạt bài này để xem lịch trình các bước ấy trong quá trình di trú tổng thể trước khi tiến hành chuyển đổi
Bước 1: Bắt đầu bước chuyển đầu tiên trong di trú mã
Đảm bảo cập nhật cấu hình PHP để hỗ trợ DB2
Cập nhật các câu lệnh SQL riêng lẻ để hỗ trợ cú pháp DB2
Mô phỏng các hàm MySQL nguyên gốc bằng cách sử dụng các hàm DB2 do người dùng định nghĩa, nếu cần
Di chuyển logic xử lý từ SQL vào PHP, nếu cần
Bước 2: Bắt đầu bước chuyển thứ hai trong di trú mã
Xem xét các thay đổi cần thiết để hỗ trợ các mức cách ly thích hợp
Tổ chức lại các truy vấn thành các đơn vị công việc logic để đạt được tính toàn vẹn dữ liệu tốt hơn và cải thiện hiệu năng
Bước 3: Bắt đầu thử nghiệm trường hợp sử dụng nghiệp vụ khởi đầu với các bên liên quan
Trang 3 Phối hợp các bên liên quan để thực hiện các trường hợp sử dụng đã quen thực hiện trong hệ thống cũ
Nắm bắt các thất bại kiểm thử như là các khiếm khuyết cần được các nhà phát triển phân tích và sửa chữa
Bước 4: Giải quyết nút nghẽn cổ chai và xác nhận dựa vào vạch chuẩn chức năng
Cải thiện hiệu năng của hệ thống dựa vào sự phản hồi của người dùng sau khi kiểm tra chức năng
Tập trung vào những gì DB2 có thể sửa chữa tự động cho bạn, vì DB2 là sự thay đổi lớn nhất mà bạn đưa vào
Giải quyết nút nghẽn cổ chai PHP bằng cách xem xét cách sử dụng tài nguyên của
hệ điều hành
Bước 5: Đánh giá vạch chuẩn di trú mã
Sau khi hoàn thành theo cách lặp lại các bước trên, khai báo hoàn thành việc chuyển đổi mã
Sao lưu hệ thống và gắn thẻ mốc quan trọng trong hệ thống kiểm soát mã nguồn của bạn
Đánh giá mức độ chuẩn bị cần thiết cho nhiệm vụ tiếp theo: triển khai ứng dụng
Chương 8 và 10 trong Sách Đỏ miễn phí của IBM (IBM Redbook ®) Hướng dẫn chuyển
đổi MySQL sang DB2
Chương 4 và 6 trong Sách Đỏ miễn phí của IBM Phát triển các ứng dụng PHP cho Các
máy chủ dữ liệu IBM
Bài viết trên developerWorks "Danh sách khuyến khích đọc: Phát triển ứng dụng DB2 cho Linux, UNIX, và Windows"
Các mục blog của Daniel Krook về kinh nghiệm cá nhân của ông trong một dự án di trú cho một ISV
Tất nhiên các tài liệu về ngôn ngữ lập trình PHP và phần mở rộng của trình điều khiển DB2 cũng
là các phương tiện cần thiết
Một lựa chọn khác là sử dụng đám mây cho quá trình di trú Bạn có thể sử dụng Linux EC2 của Amazon và các AMI của DB2, hoặc đăng ký dùng IBM SmartCloud (tên cũ là Development and Test on the Cloud - Phát triển và Thử nghiệm trên Đám mây của IBM)(xem phần Tài nguyên )
Trang 4Với ứng dụng ví dụ trong bài này, mã nguồn cho Project Tracking Tool (PTT - Công cụ theo dõi
dự án) bao gồm hàng trăm tệp PHP Cơ sở mã có các thư viện hàm, mã hướng-đối tượng được tổ chức thành các đối tượng truyền dữ liệu và các lớp của trình quản lý, các đoạn khuôn mẫu
HTML khác nhau và các trình trợ giúp để biểu hiện giao diện người dùng
Cơ sở dữ liệu PTT được sử dụng với các hàm khác nhau để hỗ trợ luồng công việc cung cấp thông tin được công bố trên ibm.com Hơn 4.000 người dùng trên toàn thế giới truy cập và sửa đổi cơ sở dữ liệu PTT thông qua mặt tiền web PHP Tại bất kỳ thời điểm nào, đều có hàng trăm người dùng đang hoạt động đồng thời trên hệ thống
Mã này được triển khai vào một máy chủ web Apache, nó nạp tệp mod_php như là một mô đun chia sẻ
Trong ví dụ này, mã hiện có đã được cập nhật cho hệ thống DB2 mới, chủ yếu là bằng cách thực hiện các sửa đổi với SQL nhúng Các sửa đổi nhỏ khác bắt buộc phải làm là cập nhật cấu hình PHP để sử dụng trình điều khiển DB2 và điều chỉnh mã kết nối cơ sở dữ liệu, sử dụng một chuỗi kết nối mới Bài này cũng xác định và tập trung vào một số cải tiến cấu trúc ứng dụng để hoàn thiện hơn khung kiến trúc mô hình-khung nhìn-trình điều khiển (MVC) nhằm cải tiến chất lượng,
tổ chức và bảo trì ứng dụng
Về đầu trang
Cài đặt phần mềm chuyển đổi
Để chuẩn bị cho việc chuyển đổi mã ví dụ, hãy cài đặt các thành phần sau đây trên một máy trạm Windows được sử dụng để thực hiện các bước chuyển đổi
Một phiên bản của bản sao MySQL của cơ sở dữ liệu nguồn
Để kiểm tra mỗi thay đổi mã, điều quan trọng là có một bản sao của hệ thống cũ sẵn sàng
để sử dụng làm một tham chiếu chức năng để xác nhận hợp lệ các thay đổi cho hệ thống mới bên cạnh hệ thống cũ Bạn có thể sử dụng chính hệ thống như bạn đã làm trong Phần 2
Một phiên bản DB2 với các trình điều khiển máy chủ dữ liệu được cài đặt cục bộ hoặc trên một máy chủ thử nghiệm
Cài đặt DB2 để tạo cơ sở dữ liệu đích mới trên máy trạm Nói chung, cơ sở dữ liệu này không nhất thiết là ấn bản giống như cơ sở dữ liệu được sử dụng trong sản xuất, nhưng để tương thích tính năng hoàn toàn, một ý tưởng tốt là nên chọn cùng ấn bản Để làm theo các ví dụ trong bài này, hãy cài đặt Ấn bản máy chủ doanh nghiệp của DB2 (DB2
Enterprise Server Edition) Phiên bản 9.7.2 Đảm bảo rằng các trình điều khiển của máy chủ dữ liệu có sẵn để cung cấp các thư viện khách PHP cần thiết Bạn có thể sử dụng chính hệ thống như bạn đã làm trong Phần 2
Một phiên bản PHP được xây dựng với phần mở rộng ibm_db2 hoặc PDO_IBM (PHP Data Objects)
Tải về phiên bản mới nhất của Zend Server và chọn phần mở rộng DB2 tùy chọn, có yêu cầu cài đặt các gói bổ sung
Trang 5Một môi trường phát triển tích hợp (IDE), ví dụ Zend Studio hoặc Các công cụ phát triển PHP (PDT) của Eclipse
Sử dụng một IDE nhận biết-PHP, ví dụ Zend Studio hoặc Các công cụ phát triển PHP của Eclipse, để dễ dàng phát triển PHP của bạn Vì bạn duy trì một ứng dụng PHP, nên nhiều khả năng là bạn đã có một công cụ ưa thích
Hãy chắc chắn ghi lại chi tiết các quyết định cấu hình và các bài học thu được của bạn để cho bạn có thể lặp lại các bước khi triển khai Xem xét việc ghi lưu một ảnh chụp của hệ điều hành Windows thành một ảnh ảo tại các cột mốc chính mỗi khi đạt được các đích quan trọng để dùng làm các bản sao lưu cấu hình và các vạch chuẩn để so sánh cải thiện tiếp mã lệnh
Nếu bạn muốn chụp một ảnh của một cấu hình máy tính vật lý, bạn có thể làm điều đó bằng VMware vCenter Converter miễn phí Một cách thay thế khác là xem xét dùng đám mây cho các thay đổi năng động này Bạn có thể sử dụng các AMI DB2 cho EC2 của Amazon, hoặc bạn có thể đăng ký dùng IBM SmartCloud (tên cũ là Development and Test on the IBM Cloud) Với các máy tính ảo, bạn sẽ có thể tránh được các cố gắng ban đầu để mua phần cứng máy chủ và cài đặt một hệ điều hành và DB2, điều này sẽ tiết kiệm thời gian, tăng tốc độ di trú, và mang lại cho bạn
sự tự tin để trải nghiệm với cấu hình phù hợp nhất cho các nhu cầu của bạn Có thể tìm thấy các liên kết đến tất cả các sản phẩm này trong phần Tài nguyên
Về đầu trang
Bước 1: Bắt đầu một bước chuyển đầu tiên về di trú mã
Bước chuyển đổi mã quan trọng đầu tiên là cấu hình cơ sở hạ tầng PHP và DB2 mới và chuyển đổi cách ứng dụng sử dụng PHP và SQL để truy cập dữ liệu Bước này liên quan đến các bước nhỏ sau:
Cập nhật cấu hình và trình điều khiển PHP
Chuyển đổi cú pháp SQL
Tạo các hàm do người dùng định nghĩa để mô phỏng MySQL
Di chuyển logic từ SQL vào PHP, nếu cần
Cập nhật cấu hình và trình điều khiển PHP
Đảm bảo rằng cấu hình PHP hiện có được sửa đổi để hỗ trợ trình điều khiển của DB2, để khớp với bộ mã hóa ký tự cơ sở dữ liệu máy chủ và để cung cấp các thông báo chẩn đoán quan trọng thông qua cảnh báo và các thông báo lỗi đầy đủ mọi chi tiết
Để cập nhật mã PHP cho DB2, bạn sẽ thường thay đổi từng điểm trong mã ở đó các hàm mở rộng ibm_db2 được sử dụng hoặc cập nhật chuỗi kết nối PDO_IBM để thực hiện giao diện PDO (Các đối tượng dữ liệu PHP) Nếu bạn sử dụng PDO như một thư viện trừu tượng hóa cơ sở dữ liệu trong hệ thống dựa trên MySQL của mình, các thay đổi mã của bạn sẽ không đáng kể Đó chỉ là vấn đề thay đổi một chuỗi kết nối duy nhất Nhưng cho dù là bạn đang sử dụng phần mở rộng thủ tục ibm_db2, nhiệm vụ này cũng đơn giản Bạn có thể thay thế bình thường bất kỳ các hàm nào bắt đầu với mysql_ hoặc mysqli_ trong mã của bạn bằng các tiền tố db2_ tương đương
Trang 6Xem phần 6.3 Chương 6 về Phát triển các ứng dụng PHP cho các máy chủ dữ liệu của IBM
trong Sách Đỏ của IBM (xem phần Tài nguyên) để biết các bảng ánh xạ tương ứng các hàm và
mã mẫu
Cả hai phương thức kết nối đều dựa vào máy khách DB2 làm một cầu nối để nối đến máy chủ DB2, vì vậy bạn cần xác nhận rằng máy khách DB2 đã được cấu hình khớp với các thiết lập trên máy chủ từ xa Cụ thể, bạn cần đảm bảo chắc chắn rằng trang mã ký tự của máy khách DB2 giống như trang mã ký tự của máy chủ DB2, nếu không, bạn sẽ gặp khó khăn với các bộ ký tự Với ví dụ này, hãy chạy lệnh được hiển thị trong Liệt kê 1 để thiết lập bộ mã hóa ký tự máy khách là UTF-8, sẽ phù hợp với lệnh CREATE DATABASE trong Liệt kê 1 trong Phần 2
Liệt kê 1 Thiết lập trang mã máy khách DB2 thành UTF-8
Liệt kê 3 Thiết lập các tham số kiểm soát lỗi trong php.ini
8.1 các điểm giống nhau và khác nhau của Ngôn ngữ thao tác dữ liệu trong Sách Đỏ Hướng dẫn
chuyển đổi MySQL sang DB2 để xem một danh sách các phép chuyển đổi cú pháp phổ biến Sau
đây là một vài tình huống trong ứng dụng nghiên cứu chi tiết
Trang 7Cách xử lý ký tự đại diện của mệnh đề SELECT
Các câu lệnh SELECT sử dụng một ký tự đại diện (ký tự dấu hoa thị) để chọn cột cụ thể bên cạnh tất cả các cột của nhiều bảng là hợp pháp trong MySQL, nhưng chúng lại không được phép trong DB2 Trong trường hợp này, thêm tên bảng (hoặc bí danh) đầy đủ vào trước ký tự đại diện, chỉ rõ mỗi cột của mỗi bảng mà bạn đang quan tâm đến hoặc đơn giản là liệt kê tất cả các cột trong mỗi bảng với một ký tự đại diện duy nhất Liệt kê 4 cho thấy cách sửa đổi các truy vấn như vậy
Liệt kê 4 So sánh các ký tự đại diện của cột và bảng hợp pháp trong MySQL và DB2
In MySQL:
SELECT R.NAME, *
FROM USER U, ROLE R
WHERE U.ROLE_ID = R.ID;
In DB2:
SELECT R.NAME, U.*
FROM USER U, ROLE R
WHERE U.ROLE_ID = R.ID;
Or
SELECT R.NAME, U.ID, U.NAME, U.ROLE_ID, U.DEPART_ID
FROM USER U, ROLE R
WHERE U.ROLE_ID = R.ID;
Mệnh đề SELECT quy định cụ thể kích thước tối đa của tập kết quả với LIMIT
LIMIT (Giới hạn) là một từ khóa không chuẩn, chỉ duy nhất của MySQL quy định cụ thể
số lượng tối đa các hàng được trả về từ một truy vấn DB2 sử dụng cú pháp FETCH FIRST
n ROWS ONLY cho cùng một mục đích Liệt kê 5 cho bạn thấy cách viết lại truy vấn với DB2
Liệt kê 5 Quy định số lượng tối đa các hàng được trả về từ một truy vấn trong MySQL và DB2
Liệt kê 6 So sánh các phép gộp GROUP BY hợp pháp trong MySQL và DB2
In MySQL:
SELECT R.ID, R.NAME, COUNT(U.ID) AS NUM
FROM USER U, ROLE R
Trang 8WHERE U.ROLE_ID = R.ID
GROUP BY R.ID;
In DB2:
SELECT R.ID, MIN(R.NAME), COUNT(U.ID) AS NUM
FROM USER U, ROLE R
WHERE U.ROLE_ID = R.ID
GROUP BY R.ID;
Or
SELECT R.ID, R.NAME, COUNT(U.ID) AS NUM
FROM USER U, ROLE R
WHERE U.ROLE_ID = R.ID
GROUP BY R.ID, R.NAME;
Trong Liệt kê 6, bạn có thể cập nhật GROUP BY, vì cả hai R.ID và R.NAME là khóa duy nhất trong bảng này Liệt kê 7 cho thấy một loại truy vấn GROUP BY khác không thể xử lý đơn giản như truy vấn trong Liệt kê 6
Liệt kê 7 GROUP BY không rõ ràng trong MySQL cần được sửa đổi cho DB2
In MySQL:
SELECT R.ID, R.NAME, COUNT(U.ID) AS NUM
FROM USER U, ROLE R
WHERE U.ROLE_ID = R.ID
GROUP BY R.NAME;
Trong trường hợp này, R.ID là duy nhất trong bảng, nhưng R.NAME thì không Nếu có bản sao giá trị R.NAME trong bảng ROLE, thì bạn không thể thay thế R.ID bằng MIN(R.ID) và bạn không thể thêm R.ID vào mệnh đề GROUP BY Cách bạn chuyển đổi SQL này như thế nào phụ thuộc vào bạn mong đợi kết quả dạng nào Liệt kê 8 cho thấy một vài tùy chọn cho tình huống này
Liệt kê 8 Truy vấn GROUP BY đã dịch trong DB2
R.NAME, COUNT(U.ID) AS NUM
FROM USER U, ROLE R
WHERE U.ROLE_ID = R.ID
GROUP BY R.NAME;
Option 2, if role name is same, treat it as same role In this case, the result is a little different from MySQL version in that there is no R.ID:
SELECT R.NAME, COUNT(U.ID) AS NUM
Trang 9FROM USER U, ROLE R
WHERE U.ROLE_ID = R.ID
GROUP BY R.NAME;
Option 3, if role ID is different, treat them as different role
In this case, the result is totally different than the MySQL version: SELECT R.ID, R.NAME, COUNT(U.ID) AS NUM
FROM USER U, ROLE R
WHERE U.ROLE_ID = R.ID
GROUP BY R.ID, R.NAME;
REPLACE INTO trong MySQL so với MERGE trong DB2
MySQL cung cấp một mệnh đề REPLACE INTO DB2 cung cấp một mệnh đề MERGE cho một mục đích tương tự, nhưng không tương đương Để đạt được kết quả tương đương, hãy tạo ra một bản ghi mới hoặc thay thế một bản ghi hiện có nếu nó có khóa chính giống nhau hoặc giá trị duy nhất Liệt kê 9 cho thấy cách kiểm tra một giá trị duy nhất trong bảng và hoặc cập nhật hoặc chèn các giá trị
Liệt kê 9 Dịch cú pháp REPLACE INTO của MySQL sang DB2
In MySQL:
REPLACE INTO ROLE (ID, NAME, DESCRIPTION)
SELECT ID, NAME, DESCRIPTION
FROM ROLE_TMP;
In DB2:
MERGE INTO ROLE R
USING (SELECT ID, NAME, DESCRIPTION FROM ROLE_TMP) RT
ON (R.ID = RT.ID)
WHEN MATCHED THEN
UPDATE SET (ID, NAME, DESCRIPTION) = (RT.ID, RT.NAME, RT.DESCRIPTION)
WHEN NOT MATCHED THEN
INSERT (ID, NAME, DESCRIPTION) VALUES (RT.ID, RT.NAME, RT.DESCRIPTION);
Mệnh đề JOIN
Khi thực hiện một phép nối (join) ngoài với một cặp bảng đồng thời cũng lấy ra dữ liệu
từ một bảng thứ ba, hãy chỉ rõ các bảng được sử dụng cho phép nối ngoài kề ngay bên cạnh các từ khóa JOIN trong DB2 MySQL cho phép chúng được liệt kê theo bất kỳ thứ
tự nào Liệt kê 10 cho thấy sự thay đổi cần thiết
Liệt kê 10 So sánh cú pháp JOIN của MySQL và DB2
Both of the following work in MySQL:
SELECT *
FROM USER U, ROLE R
LEFT JOIN DEPARTMENT D
ON U.DEPT_ID = D.ID;
Or
SELECT *
FROM ROLE R, USER U
LEFT JOIN DEPARTMENT D
ON U.DEPT_ID = D.ID;
Trang 10Only this one works in DB2:
SELECT * FROM ROLE R, USER U
LEFT JOIN DEPARTMENT D
ON U.DEPT_ID = D.ID;
Các ký tự thoát
Ký tự \ biểu diễn một dấu gạch chéo ngược là mã thoát áp dụng cho dấu nháy đơn ' trong MySQL, nhưng trong DB2, một dấu nháy đơn phải được áp mã thoát bằng cách thêm một dấu nháy đơn khác " (hai dấu nháy đơn) Liệt kê 11 cho thấy một ví dụ về các dãy
mã thoát cho một chuỗi ký tự sử dụng một dấu nháy đơn như là một dấu móc lửng
Liệt kê 11 MySQL sử dụng dấu gạch chéo ngược để áp mã thoát cho các dấu nháy đơn, trong khi ở đó DB2 sử dụng một dấu nháy đơn thứ hai
In MySQL:
SELECT * FROM ROLE
WHERE DESCRIPTION = 'It\'s a super admin role';
In DB2:
SELECT * FROM ROLE
WHERE DESCRIPTION = 'It''s a super admin role';
Kiểm tra ngoài phạm vi trong DB2
MySQL không bắt buộc đúng phạm vi cho một kiểu dữ liệu trong một mệnh đề SELECT, nhưng DB2 thì có Do đó SQL được hiển thị trong Liệt kê 12 để truy vấn thông tin trong khoảng thời gian từ 01.02 và 30.02 không làm việc trong DB2, nhưng nó làm việc trong MySQL
Liệt kê 12 MySQL không kiểm tra dải các giá trị cho các mệnh đề WHERE dựa vào kiểu
dữ liệu
MySQL allows you to specify February 30th as part of the range
SELECT * FROM USER
WHERE BIRTHDAY BETWEEN '1980-02-01' AND '1980-02-30';
CHÈN vào một cột NOT NULL không cần một giá trị mặc định
Trong MySQL, nếu bạn cố gắng thực hiện một câu lệnh INSERT mà không cung cấp một giá trị cho một cột NOT NULL, thì lệnh này vẫn thành công MySQL tự động điền vào một giá trị mặc định, ngay cả khi bạn chưa bao giờ định nghĩa một giá trị mặc định cho cột đó khi tạo bảng Tuy nhiên, trong DB2, bạn phải cung cấp một giá trị cho các cột NOT NULL trong một câu lệnh INSERT khi vẫn chưa đinh nghĩa một giá trị mặc định Các câu lệnh SQL trong Liệt kê 13 cho thấy các hành vi xử lý khác nhau
Liệt kê 13 MySQL và DB2 xử lý chèn các giá trị NULL một cách khác nhau
Works in both MySQL and DB2
CREATE TABLE TEST1 (ID INTEGER, NAME VARCHAR(20) NOT NULL);
Works in MySQL, doesn't work in DB2
INSERT INTO TEST1 (ID) VALUES(1);
Trang 11Works in both MySQL and DB2
CREATE TABLE TEST2 (ID INTEGER, NAME VARCHAR(20) NOT NULL DEFAULT '');
Works in both MySQL and DB2
INSERT INTO TEST2 (ID) VALUES(1);
Sử dụng các chế độ tương thích mới của DB2
Trong khi bạn có thể mô phỏng một số cú pháp MySQL bằng cách sử dụng các hàm do người dùng định nghĩa, có một lựa chọn khác là thiết lập một trong các chế độ tương thích dành cho các phiên bản của DB2 sau phiên bản 9.7.2 Đọc thêm về kích hoạt cú pháp LIMIT và OFFSET trên blog của Antonio Cangiano
Chuyển đổi các hàm của MySQL thành các hàm tương tự của DB2
Bên cạnh SQL đặc thù riêng của MySQL, bạn cũng có thể đang sử dụng các hàm
MySQL dựng sẵn Bạn có thể thay thế các hàm này bằng các hàm SQL tiêu chuẩn hoặc các hàm tương đương có sẵn trong DB2 Tham khảo Phụ lục A: Ánh xạ các hàm dựng
sẵn và các toán tử của MySQL trong Sách Đỏ Hướng dẫn chuyển đổi MySQL sang DB2
(xem phần Tài nguyên)
Như vừa được mô tả, nếu bạn không thể tìm thấy một hàm tương đương của DB2, thì bạn có thể viết lại SQL của mình để truy cập dữ liệu theo một cách khác Ngoài ra, bạn có thể chọn mô phỏng hàm đó trong DB2 hoặc di chuyển logic vào mã PHP của mình, như được mô tả trong các phần sau
Tạo các hàm do người dùng định nghĩa để mô phỏng các tính năng của MySQL
Nếu bạn không thể chỉ cập nhật các câu lệnh SQL theo cú pháp DB2 để đạt được cùng kết quả như các truy vấn MySQL của bạn, thì bạn có thể khắc phục bằng một cách khác dưới dạng một hàm do người dùng định nghĩa (UDF) trong SQL của DB2 để mô phỏng một hàm MySQL dựng sẵn
Đã có một số chỗ sử dụng MySQL và PHP trong kịch bản ví dụ cần được tiếp cận theo cách khác khi cập nhật ứng dụng để sử dụng DB2 Cụ thể, bạn có thể di chuyển một số chức năng ra khỏi MySQL đưa vào PHP, ví dụ như khi thực hiện chuyển dịch ngày Hoặc bạn có thể mô phỏng hàm trong DB2, ví dụ như để tạo các hàm do người dùng định nghĩa trong DB2 cho gần giống một số hàm được xây dựng trong MySQL, bao gồm cả UNIX_TIMESTAMP() và NOW()
Phụ lục B trong Sách Đỏ Hướng dẫn chuyển đổi MySQL sang DB2 (xem phần Tài nguyên) giải thích các sự khác biệt và đưa ra một cách tiếp cận để giải quyết các thay đổi Những mẹo nhỏ của Daniel Krook đã thu thập được từ kinh nghiệm di trú của khách hàng của ông cũng rất có ích (xem phần Tài nguyên)
DML của DB2 khác với MySQL Bài này mô tả cách chuyển đổi các SQL nhúng từ MySQL sang DB2 Tuy nhiên, không cần thiết chuyển đổi tất cả cú pháp từ MySQL sang DB2, đặc biệt
là đối với các hàm dựng sẵn của MySQL Phụ lục A Ánh xạ các hàm dựng sẵn và các toán tử