01/10/2018, 01:17
Tìm kiếm không dấu trong sql
Trong cột của em có lưu trữ chữ Hồng nhưng truy vấn mênh đề " LIKE ‘%hong%’ " thì ko cho ra kết quả , chỉ khi nhập có dấu nó mới ra đúng . Vậy có cách nào không vậy mọi người ?
Bài liên quan
Em dùng cơ sơ dữ liêụ nào?
Nếu là SQL Server có thể tìm hiểu fulltext search và FREETEXT function
Lâu rồi anh không dùng, nhưng anh nhớ là nó làm được, thử xem.
Thường những cột nào dùng để search thì mình hay thêm 1 field phiên bản ascii của nó. Ví dụ: Field title có nội dung “Đông lạnh” thì field ascii_title có nội dung: “dong lanh”.
Làm như vậy sẽ dễ hơn cho việc tìm kiếm và sắp xếp.
Do vấn đề sắp xếp sẽ gặp rắc rối đối với các kí tự chữ hoa và chữ thường, ascii và không ascii (d và đ không nằm kế nhau).
Hiện tại mình đang xài MYSQL 5.1.x hỗ trợ tìm kiếm tiếng việt có dấu (nhưng đặc biệt là chữ Đ nó không tìm được)
Nếu bạn muốn hàm convert có dấu sang không dấu thì dùng hàm này (mình đang sài):
function convertAlias($cs){ $vietnamese=array("à","á","ạ","ả","ã","â","ầ","ấ","ậ","ẩ","ẫ","ă","ằ","ắ","ặ","ẳ","ẵ", "è","é","ẹ","ẻ","ẽ","ê","ề","ế","ệ","ể","ễ", "ì","í","ị","ỉ","ĩ", "ò","ó","ọ","ỏ","õ","ô","ồ","ố","ộ","ổ","ỗ","ơ","ờ","ớ","ợ","ở","ỡ", "ù","ú","ụ","ủ","ũ","ư","ừ","ứ","ự","ử","ữ", "ỳ","ý","ỵ","ỷ","ỹ", "đ", "À","Á","Ạ","Ả","Ã","Â","Ầ","Ấ","Ậ","Ẩ","Ẫ","Ă","Ằ","Ắ","Ặ","Ẳ","Ẵ", "È","É","Ẹ","Ẻ","Ẽ","Ê","Ề","Ế","Ệ","Ể","Ễ", "Ì","Í","Ị","Ỉ","Ĩ", "Ò","Ó","Ọ","Ỏ","Õ","Ô","Ồ","Ố","Ộ","Ổ","Ỗ","Ơ","Ờ","Ớ","Ợ","Ở","Ỡ", "Ù","Ú","Ụ","Ủ","Ũ","Ư","Ừ","Ứ","Ự","Ử","Ữ", "Ỳ","Ý","Ỵ","Ỷ","Ỹ", "Đ"); $latin=array("a","a","a","a","a","a","a","a","a","a","a","a","a","a","a","a","a", "e","e","e","e","e","e","e","e","e","e","e", "i","i","i","i","i", "o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o", "u","u","u","u","u","u","u","u","u","u","u", "y","y","y","y","y", "d", "A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A", "E","E","E","E","E","E","E","E","E","E","E", "I","I","I","I","I", "O","O","O","O","O","O","O","O","O","O","O","O","O","O","O","O","O", "U","U","U","U","U","U","U","U","U","U","U", "Y","Y","Y","Y","Y", "D"); $csLatin= str_replace($vietnamese,$latin,$cs); return $csLatin; }
Trước khi truyền chuỗi string để search vào SQL mình cho chuỗi string qua hàm này à bạn?
Nếu câu lệnh SQL của bạn không tìm được chữ có dấu thì bạn làm như sau:
convertAlias($row['NAME'])
convertAlias($key_search)
MORE: Nếu muốn tìm chuyên nghiệp hơn bạn tách
$key_search
thành nhiều$key
con để tìm trong trường hợp người ta nhập từ khóa sai chính tả chẳng hạnNhư vậy có quá tốn bộ nhớ không?
Tùy bên server nào thôi, giống như bên SQL Server thì nó có cách tìm có riêng nó, config là được, ko cần viết code, cứ %hong% là tự động ra có dấu vs ko dấu hết
Bạn đang sử dụng database server nào?
Nếu SQL SERVER chỉ cần cấu hình cột trong database là xong thôi.
CÁCH LÀM:
Việc chúng là cần làm là thiết lập cho thuộc tính Collation của các cột của bảng cần tìm kiếm toàn văn một giá trị thích hợp. Ở đây mình chọn giá trị “SQL_Latin1_General_CP1_CI_AI”.
Trong SQL Server Management Studio, chọn bảng cần làm việc, nhấp phải chuột chọn Modify, tìm đến cột cần làm việc (tức cột sau này cần tìm kiếm toàn văn, ví dụ cột tên, cột địa chỉ, …) bằng cách nhập chuột vào đó. Trong của sổ Column Properties tương ứng với cột chọn, tìm đến thuộc tính Collation, nó đang ở chế độ mặc định thì sẽ có dòng chữ “”. Nhấp chuột vào nút … bên phải, trong hộp thoại hiện ra, chọn Sql Collation thay vì Windows Collation. Trong combobox, chọn giá trị “SQL_Latin1_General_CP1_CI_AI” cho Sql Collation. Xong nhập OK để kết thúc. Công việc đã xong, các bạn hãy thử vài truy vấn để kiểm tra nhé.
LƯU Ý:
LỜI KHUYÊN:
Link gốc: http://diendan.congdongcviet.com/threads/t78345::tim-kiem-toan-van-trong-sql-server.cpp