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 ?

Nguyen Ca viết 03:24 ngày 01/10/2018

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.

Son Tran viết 03:29 ngày 01/10/2018

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).

Kollein Vĩnh viết 03:23 ngày 01/10/2018

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; }

Jiang Xin viết 03:30 ngày 01/10/2018

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?

Kollein Vĩnh viết 03:25 ngày 01/10/2018

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:

  • Fetch-all các dữ liệu mà bạn muốn tìm trong database rồi dùng hàm convertAlias($row['NAME'])
  • Cũng tương tự với từ khóa nhập vào convertAlias($key_search)
  • Cuối cùng dùng strpos() tìm mẫu A trong mẫu B nếu có xuất hiện thì khớp lệnh (tôi chốt)

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ạn

Jiang Xin viết 03:20 ngày 01/10/2018

Như 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

Hoàng Nguyễn viết 03:31 ngày 01/10/2018

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:

  • Khi chúng ta tạo mới một Database (DB) thì thuộc tính Collation của DB mặc định là “Vietnamese_CI_AS”. Theo đó, các cột của bảng có kiểu dữ liệu thuộc một trong các kiểu char, nchar, varchar, nvarchar, text, ntext cũng có thuộc tính Collation là “Vietnamese_CI_AS”. (Như vậy, DB và các Table đều có thuộc tính Collation của riêng nó).
    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 Ý:

  • Để nhẹ nhàng hơn, khỏi phải mất công tìm giá trị “SQL_Latin1_General_CP1_CI_AI” trong combobox cho thuộc tính Collation thì các bạn có thể làm như sau:
  • Trước hết, thiết lập thuộc tính Collation cho DB có giá trị “SQL_Latin1_General_CP1_CI_AI”. Nhấp chuột phải vào DB, chọn Properties, trong hộp thoại Database Properties hiện ra, nhấp chuột vào Options ở bên trái hộp thoại, mục Collation hiện ra bên phải, chọn giá trị “SQL_Latin1_General_CP1_CI_AI” trong combobox, xong nhấp OK để kết thúc.
  • Tiếp theo, bây giờ vẫn phải vào thiết lập thuộc tính Collation cho các cột cần tìm kiếm toàn văn trong các bảng như trên. Tuy nhiên, trong hộp thoại Column Properties, các bạn không cần phải chọn Sql Collation, không phải tìm đến giá trị “SQL_Latin1_General_CP1_CI_AI” trong combobox nữa, mà các bạn chỉ cần nhập vào nút “Restore Default” là xong.

LỜI KHUYÊN:

  • Nếu ngay từ ban đầu, khi mới tạo DB mà chưa có Table nào, nếu DB được thiết lập thuộc tính Collation có giá trị “SQL_Latin1_General_CP1_CI_AI” thì khi tạo các bảng, các cột (có kiểu dữ liệu thuộc một trong các kiểu đã nói ở trên) sẽ mặc định theo thuộc tính Collation của DB là “SQL_Latin1_General_CP1_CI_AI”. Do đó, nếu xác định ứng dụng (kể cả software, website nói chung) có thể có sử dụng tìm kiếm toàn văn (mà thông thường là vậy) thì ngay từ khi tạo mới DB, hãy thiết lập thuộc tính Collation chó DB để sau này khỏi mất công thiết lập cho từng cột trong các bảng như vậy.

Link gốc: http://diendan.congdongcviet.com/threads/t78345::tim-kiem-toan-van-trong-sql-server.cpp

Bài liên quan
0