- Thêm mới các chủ đề, chủ đề con, các bài viết trên trang
4.3.5. Thay đổi các thành phần khác
PHỤ LỤC 1
HỆ QUẢN TRỊ CSDL MYSQL
1.Giới thiệu MySQL
MySQL hiện nay trở thành một trong những hệ cơ sở dữ liệu mã nguồn mở phổ biến nhất và có tốc độ phát triển nhanh nhất trong giới công nghệ phần mềm cơ sở dữ liệu. MySQL do công ty MySQL AB phát triển và nay đã được Sun mua lại. Đội ngũ phát triển của hệ thống với trên 100 chuyên gia và hàng ngàn người tham gia vào việc kiểm thử hệ thống và tích hợp MySQL với các sản phẩm khác.
MySQL có một số điểm mạnh chính sau:
• Là một hệ quản trị dữ liệu quan hệ. Dữ liệu được tổ chức ở dạng các bảng. Điều này làm tăng tốc độ xử lý và sự linh hoạt.
• Dễ dàng sử dụng và triển khai.
• MySQL server rất nhanh, đáng tin cậy và dễ sử dụng. Khả năng kết nối, tốc độ và tính an toàn của MySQL server thích hợp cho cơ sở dữ liệu trên Internet.
• Làm việc ở các hệ thống client/server. Phần mềm cơ sở dữ liệu MySQL là một hệ thống client/server, bao gồm một server SQL đa tuyến hỗ trợ các chương trình client khác nhau, các công cụ quản trị và một loạt các giao diện lập trình ứng dụng (API) như C/C++, Perl, Java, PHP.
• Chạy trên hơn 20 nền khác nhau chủ yếu ở Linux, Max OS X, Unix và
Windows.
2. Hệ thống file trong MySQL
Sau khi cài đặt MySQL, xuất hiện file my.ini trong thư mục C:\Windows. File này ghi lại nơi cơ sở dữ liệu được lưu vào khi nó được tạo ra. Ngoài ra còn có các thư mục sau:
o Bin: Chứa các chương trình client và server o data: Chứa các cơ sở được tạo và các o Docs: Chứa tư liệu hướng dẫn sử dụng
o Examples: Chứa những đoạn chương trình và script ví dụ o Include: Chứa file header
o lib: Chứa các thư viện
o scripts: Chứa các script tiện ích o share: Chứa các file thông báo lỗi
3. Khởi động MySQL database server
3.1. Chạy MySQL server
Có 2 cách để chạy MySQL server. Đó là từ dòng lệnh hoặc từ kích chuột vào file mysqld. Nếu ở chế độ dòng lệnh:
C:\> C:\mysql\bin\mysqld --console
Tham số --console sẽ đưa những thông báo của mysqld ra màn hình. Trong trường hợp không có tham số trên hay chạy từ kích chuột thì các thông báo được ghi tiếp vào file mysql.err trong thư mục mysql\data. Để ngừng sự hoạt động của MySQL server, dùng:
C:\> C:\mysql\bin\mysqladmin -u root shutdown
3.2. Cài đặt MySQL server như một dịch vụ
Để cài đặt server như một dịch vụ, tên dịch vụ mặc định là MySQL: C:\> C:\mysql\bin\mysqld --install
Sau khi cài đặt MySQL server như một dịch vụ, Windows sẽ khởi động MySQL một cách tự động khi mà Windows khởi động.
Nếu không muốn dịch vụ tự động khởi động trong quá trình boot, dùng lệnh: C:\> C:\mysql\bin\mysqld --install-manual
Muốn xoá bỏ server được cài đặt như một dịch vụ, hãy dừng nó nếu nó đang chạy và gõ lệnh:
C:\> C:\mysql\bin\mysqld --remove
3.3 Các kiểu dữ liệu cơ bản trong MySql
Bảng dưới đây trình bày những kiểu dữ liệu dùng trong MySQL.
Loại Khoảng Số byte Giải thích
tinyint -127...128 0...255 1 Số nguyên rất nhỏ smallint -32768...32767 0...65535 2 Số nguyên nhỏ mediumint -8388608...838860 0...16777215 3 Số nguyên trung bình int -231...231-1 0...232-1 4 Số nguyên bigint -263...263-1 0...266-1 8 Số nguyên lớn float single (<=24)
double (từ 25 tới 38) Kiểu single hay double
date 1000-01-01...9999-12-31 yyyy-mm-dd time 00:00:00...23:59:59 hh:mm:ss datetime 1000-01-01...9999-12-31 00:00:00...23:59:59 yyyy-mm-ddhh:mm:ss char 255 kí tự varchar 255 kí tự
text 65535 kí tự Tạo được index trên 255 kí tự
đầu Các kiểu dữ liệu khác
1. Float[M,D]: 4 byte
Khoảng: -3,402823466E+38 đến -1,175494351E-38 0
1,175494351E-38 đến 3,402823466E+38 2. Double[M,D]: 8 byte
Khoảng: -1,7976931348623157E+308 đến -2,2250738585072014E-308 0 2,2250738585072014E-308 đến 1,7976931348623157E+308 3. TimeStamp[M] dạng ngày tháng mở rộng TimeStamp(14): yyyy-mm-dd-hh-mm-ss TimeStamp(12): yy-mm-dd-hh-mm-ss TimeStamp(10): yy-mm-dd-hh-mm TimeStamp(8): yyyy-mm-dd TimeStamp(6): yy-mm-dd TimeStamp(4): yy-mm TimeStamp(2): yy
4. Phân biệt char và varchar: với char(10) thì chỉ được phép nhập tối đa 10 kí tự còn với varchar chỉ là biến lưu trữ độ dài. Có nghĩa là varchar không thay đổi khi dữ liệu dài hay
ngắn. MySQL dùng một kí tự để lưu độ dài field của kiểu varchar và cắt bỏ những phần còn trống trong ô dữ liệu nếu không sử dụng hết.
Khi dùng lưu trữ những chuỗi có độ dài ngắn khác nhau thì dùng varchar còn nếu độ dài cố định thì dùng char.
Giá trị char(4) Số byte varchar(4) Số byte
'' ' ' 4 byte '' 1 byte
'ab' 'ab ' 4 byte 'ab' 3 byte
'abcdef' 'abcd' 4 byte 'abcd' 5 byte
5. Có 3 loại text tương tự như varchar tinytext: 255 byte
mediumtext: 1.6 MB longtext: 4.2 GB 6. Kiểu blob
Tương tự như kiểu text. Nhưng MySQL xử lý các chuỗi theo kiểu blob dạng nhị phân còn xử lý kiểu text theo dạng kí tự.
7. Kiểu enum
Gồm tập các đối tượng kiểu chuỗi. Một enum có thể chứa tối đa 65.535 đối tượng. Chẳng hạn, enum('one', 'two', 'there') được đánh chỉ số như sau:
Giá trị null có chỉ số null. Giá trị '' có chỉ số 0. Giá trị 'one' có chỉ số 1. Giá trị 'two' có chỉ số 2. Giá trị 'there' có chỉ số 3.
Khi nhập dữ liệu vào cột có kiểu enum thì giá trị của nó phải nằm vào một trong các giá trị do enum định nghĩa.
8. Những chú ý trong kiểu string
Trong kiểu string có một số kí tự đặc biệt mà việc hiện thị nó đòi hỏi phải có dấu \ đi trước. Chúng bao gồm: \\, \', \", \t (dấu tab), \n (dấu xuống dòng), \%, \_, \0 (kí tự nul).
Đối với string có thể dùng 2 loại dấu để mở đầu và kết thúc: ' hay ". Chẳng hạn: với dấu ' select 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
cho kết quả:
| hello | "hello" | ""hello"" | hel'lo | 'hello | Với dấu ":
select "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
cho kết quả:
| hello | 'hello' | ''hello'' | hel"lo | "hello | Với \n: select 'This\nIs\nFour\nLines'; cho kết quả: This Is Four Lines
Tự động loại bỏ \
select 'hello\ world'; cho kết quả:
hello world
9. Cột auto_increment: cột này tự động tăng giá trị lên một khi thêm một trường. Cột này có giá trị int.
create table test(id int not null auto_increment, a char(10));
10. Khoá ngoại
Khoá ngoại trong MySQL chỉ dùng cho bảng do InnoDB quản lý và dùng trong các câu lệnh tạo bảng.
create table parent(
id int not null,
primary key (id)
) type = InnoDB;
create table child(
id int,
parent_id int,
index par_ind(parent_id);
foreign key (parent_id) references parent(id) on delete cascade;
) type = InnoDB;
Cả 2 bảng phải dùng ở kiểu InnoDB. Trên 2 bảng này đều có cột đánh chỉ mục. Khoá ngoại hình thành dựa trên 2 chỉ mục thuộc 2 bảng ở cột foreign key và cột references. Kiểu dữ liệu ở cả 2 cột này cũng phải giống nhau. Tham số on delete cascade được sử dụng để khi một bản ghi của bảng cha bị xoá thì tất cả các bản ghi của bảng con có tham chiếu bảng cha cũng bị xoá
Các câu lệnh trong MySQL không phân biệt chữ hoa hay chữ thường. Cũng như mọi hệ quản trị cơ sở dữ liệu khác, MySQL cho phép thao tác với câu lệnh truy vấn SQL. Để có trợ giúp, chúng ta gõ:
mysql> help contents; Lệnh tạo bảng
mysql>create database database_name;
Lệnh này tạo ra một cơ sở dữ liệu tên database_name vào thư mục C:\mysql\data. Lệnh sử dụng cơ sở dữ liệu
mysql>use database_name;
Trước khi thao tác cơ sở dữ liệu như tạo bảng, chèn dữ liệu... chúng ta phải dùng lệnh này để chọn cơ sở dữ liệu thao tác.
Lệnh tạo bảng
mysql>create table table_name; Tạo bảng trong cơ sở dữ liệu đã chọn. Ví dụ:
CREATE TABLE PhoneList (
PhoneNum char(20) primary key,
LastName char(15) not null,
FirstName char(15) not null,
State char(2),
YearBorn int,
Notes char(70)
)
Lệnh Nội dung Cách dùng
select Truy vấn mẩu tin trong
cơ sở dữ liệu select * from PhoneList insert Chèn mẩu tin trong cơ
sở dữ liệu insert into PhoneListvalues (2,'Ngoc','Anh','HN',1970,' ') update Thay đổi giá trị mẩu tin update PhoneList
set State = 'Ha Noi' where State = 'HN' delete Xoá mẩu tin trong cơ
sở dữ liệu delete from PhoneList where State = 'HN' index Đặt chỉ mục cho bảng create table PhoneList(
PhoneNum int, PhoneName char(20), Index PN(PhoneNum) )
primary Đặt khoá cho bảng create table PhoneList(
PhoneNum int primary key, PhoneName char(20), )
create Tạo bảng mới Như trên.
Tạo cơ sở dữ liệu mới create database PhoneData drop Xoá bảng sau khi đã
chọn cơ sở dữ liệu chứa bảng
drop table PhoneList Xoá cơ sở dữ liệu, mọi
dữ liệu trong cơ sở dữ liệu sẽ bị mất
drop database PhoneData show Hiện thông tin quan
tâm show tables
Các lệnh trên có thể đi kèm với group by, having, order by... Ngoài ra, chúng ta có thể tạo bảng tạm thời. Những bảng này chỉ tồn tại đối với kết nối hiện tại và sẽ tự xoá khi kết nối kết thúc. Cú pháp của nó:
create temporary table table_name(...); Bảng tóm tắt các lệnh quản trị cơ sở dữ liệu:
Lệnh Nội dung
grant Trao quyền cho người dùng revoke Xoá quyền của người dùng shutdown Chấm dứt hoạt động của MySQL exit, quit Thoát khỏi MySQL
VD: trao quyền select, insert, update cho người dùng tên là Mary trên bảng tblUser.
grant select, insert, update on dbUser.* to Mary
mod(a,b) Lấy phần dư của a chia cho b select mod(29,9)
between min and max Nằm giữa min và max select 1 between 2 and 3 not between min and max Không nằm giữa min và max greatest(v1,v2...) Trả về giá trị lớn nhất.
select greatest(2,0)
in(v1,v2...) Trả về 1 nếu tìm được giá trị trong danh sách in. Còn không thì trả về 0.
select 'a' in('a',2,'b')
least(v1,v2...) Trả về giá trị nhỏ nhất trong danh sách. select least(2,0) not (!) and (&&) or (||) xor Các biểu thức lôgic select 1&&3
if(e1,e2,e3) Nếu e1 đúng trả về e2 còn không trả về e3. select if(1>2,3,4)
nullif(e1,e2) Trả về null nếu e1=e2, còn không trả về e1 select nullif(1,2)
ascii(str) Trả về mã ascii cho str select ascii('a')
bin(n) Trả về mã nhị phân cho n.
select bin(12)
char(N,...) Chuyển từ mã ascii sang kí tự select char(97,65)
char_length(str) Trả về chiều dài của chuỗi. select char_length('aaa') concat(str1,str2...) Trả về chuỗi được ghép
select concat('My','SQL')
concat_ws(x,str1,str2...) Trả về chuỗi được ghép với nhau, ngăn cách bằng x. select concat_ws(',','My','SQL')
length(str) Trả về chiều dài của chuỗi dạng byte. Có sự khác biệt với char_length. Nếu chuỗi có 5 kí tự 2 byte, length trả về 10 còn char_length trả về 5.
load_file(filename) Đọc file và trả về nội dung của file dưới dạng một chuỗi. File phải nằm trên server, filename phải có đường dẫn đầy đủ. Dung lượng file không vượt quá max_allowed_packet byte.Nếu file không tồn tại, hàm trả về null.
update table_name
set column_name = loadfile('/etc/file.txt') locate(str1,str2) Trả về vị trí của chuỗi str1 trong chuỗi str2.
select locate('a','abc')
locate(str1,str2,pos) Trả về vị trí của str1 trong str2 kể từ vị trí pos.
lower(str) Trả về chuỗi sau khi chuyển toàn bộ kí tự hoa về kí tự thường trong str.
select lower('MySQL')
repeat(str,n) Trả về chuỗi sau khi gấp n lần str. select repeat('MySQL',3)
quote(str) Trả về chuỗi str mà dấu \ không có tác dụng. Gồm cả dấu ' ở đầu chuỗi.
select 'don\'t';
select quote('don\'t');
replace(s1,s2,s3) Trả về chuỗi sau khi thay thế toàn bộ s2 bằng s3 trong s1. select replace('www','w','Ww')
trim(str) Trả về chuỗi sau khi bỏ hết dấu cách ở đầu và cuối chuỗi. upper(str) Trả về chuỗi sau khi chuyển hết chữ thường thành chữ hoa.
select upper('hej')
strcmp(s1,s2) So sánh 2 chuỗi, trả về 0 nếu 2 chuỗi bằng nhau, 1 nếu s1 lớn hơn s2 và -1 nếu s1 nhỏ hơn s2.
a div b Lấy phần nguyên.
select 5 div 2
abs(x) Lấy trị tuyệt đối của x
cos(x) sin(x)
Trả về cos, sin của x
ceil(x) Làm tròn thành số nguyên nhỏ nhất nhưng không nhỏ hơn x select ceil(1.34)
exp(x) Lấy mũ cơ số e.
floor(x) Làm tròn về số nguyên nhỏ nhất nhưng không lớn hơn x.
pi() Trả về số pi
pow(x,y) Trả về x mũ y
rand() Trả về số ngẫu nhiên từ 0 tới 1.
sqrt(x) Lấy căn bậc 2 của x.
truncate(x,d) Cắt chỉ để d số phần thập phân của số chấm động x. select truncate(1.333,1)
curdate() Trả về thời gian hiện tại dạng string có định dạng yyyymmdd. curtime() Trả về thời gian hiện tại dạng string có định dạng hh:mm:ss
4. An ninh trong MySQL
4.1. Account khởi đầu
Sau khi cài đặt, MySQL tự tạo ra một số account khởi đầu. Chúng bao gồm:
o 2 account đều có tên username là root, password là rỗng. Người đăng nhập bằng account này có mọi quyền. Đối với Windows, một trong 2 account này dùng cho việc kết nối từ localhost còn cái kia thì dùng cho các kết nối từ bất kì host nào.
o 2 account ẩn danh có username rỗng, password là rỗng. Đối với Windows, một account dùng cho localhost, có mọi quyền như account root ở trên. Cái còn lại dùng
cho các kết nối từ bất kỳ host nào và được cung cấp mọi quyền chỉ với cơ sở dữ liệu test hay những cơ sở dữ liệu nào bắt đầu bằng test.
Bởi vậy, sau khi cài đặt, chúng ta có kết nối với MySQL server bằng lệnh: C:\ c:\mysql\bin\mysql -u root
hoặc
C:\ c:\mysql\bin\mysql -u ''
Hai câu lệnh trên cho phép client kết nối với server mà không cần password. Điều này thực sự gây ra sự mất an toàn cho hệ thống. Tốt nhất sau khi cài đặt, chúng ta nên đổi password của 4 account này. Có 2 cách đổi password. Đó là dùng lệnh set password hay update. Cả 2 đều dùng hàm password để mã hoá password. Toàn bộ dữ liệu về người dùng đều được lưu trong bảng user.
mysql> set password for ''@'localhost' = password('newpass');
mysql> set password for ''@'%' = password ('newpass'); hoặc
mysql> update mysql.user set password = password('newpass') where user = 'root';
mysql> update mysql.user set password = password('newpass') where user = '';
mysql> flush privileges;
Lệnh cuối cùng có tác dụng yêu cầu server đọc lại bảng dữ liệu người dùng. Nếu không có lệnh này, chúng ta phải khởi động lại MySQL server.
4.2. Những hướng dẫn sử dụng MySQL an toàn
Không cho ai (ngoại trừ root) có thể truy nhập vào bảng user. Bởi vì trong bảng này chứa tất cả người dùng và password của họ.
Không sử dụng password ở dạng bản rõ trong cơ sở dữ liệu mà mã hoá password để tăng tính an toàn.
Cài đặt tường lửa. Điều này cho phép ngăn chặn ít nhất 50% các loại tấn công. MySQL sử dụng cổng mặc định là 3306. Kiểm tra cổng có mở hay đóng bằng lệnh:
C:\telnet server_host 3306
Nếu kết nối thất bại thì cổng đã bị đóng. Nếu không có kết nối thì không để cổng mở. Kiểm tra dữ liệu do người dùng nhập vào. Chẳng hạn, có câu truy vấn:
select * from tblUser where userID = ?
Nếu người dùng nhập vào userID = 234 thì không có chuyện gì, nhưng nếu là userID = 234 OR 1 = 1 thì khi đó câu lệnh thành:
select * from tblUser where userID = 234 OR 1 = 1
Truy vấn này làm server đưa ra mọi bản ghi có trong cơ sở dữ liệu và làm cho server bị quá tải. Để ngăn chặn điều này, dùng dấu phẩy trên để bao quanh chữ số:
Nếu người dùng có đưa thêm các ký tự khác thì nó trở thành chuỗi, MySQL sẽ tự động lược bỏ phần không phải là số trong chuỗi.
Không chuyển những dữ liệu không được mã hoá trên mạng.
4.3. Hệ thống phân quyền MySQL
MySQL dựa trên 2 tiêu chí để nhận dạng người dùng truy nhập là hostname và username. Nghĩa là, nó coi người tên Bob thực hiện kết nối từ office.com khác với người tên Bob kết nối từ bank.com.
Chức năng chính hệ thống phân quyền là xác nhận người dùng kết nối với server từ một host nào đó và kiểm tra quyền tương tác của người dùng đó đối với cơ sở dữ liệu. Như vậy, quá trình kiểm soát truy nhập MySQL bao gồm 2 giai đoạn:
Giai đoạn 1: server kiểm tra liệu người dùng có thể kết nối được với server hay không.