PDA

View Full Version : Hỏi về hàm chuyển từ chữ có dấu sang chữ không dấu trong sqlserver 2000



tuanhaikh
04-08-2009, 15:32
Mình đang lập trình trang web bằng ngôn ngữ asp.net(2005) sử dung csdl sqlserver 2000. Trong web này có chức năng tìm kiếm. Phần tìm kiếm bình thường(dùng làm like)thì mình đã làm được rồi.

Nhưng ở đây mình muốn làm nút tìm mà khi người dùng nhập vào chữ có dấu hay chữ không dấu đều tìm được(giống chức năng tìm kiếm của google)

vd: Nhập vào (vo tuan hai) có thể tìm được cả (vo tuan hai) hoặc (võ tuấn hải )

Mình đã nghĩ ra cách
- Trong csdl mình tạo thêm một cột ten_khong_dau để lưu tên không dấu
- Trong phần admin của web khi người quảng trị nhập vào text tên(ten_co_dau ) thì mình dùng câu lệnh sql cho nhập nội dung text này vào cột ten_co_dau rồi dùng câu lệnh khác để chuyển tất cả nội dung text có dấu này sang không dấu rồi nhập vào cột ten_khong_dau.
- Sau đó mình dùng hàm like cho cả hai cột này là có thể tìm vừa có dấu vừa không dấu
- Nhưng mình tìm mãi mà không thể nào tìm thấy được hàm nào có thể chuyển từ chử có dấu sang chử không dấu cả

Mong các bạn giúp đở.

tanky
04-08-2009, 16:01
Bạn xem thử nếu nhập chữ không dấu nó có ra kết quả của những chữ có dấu không?

bietdivedau
04-08-2009, 16:26
làm gì có hàm nào chuyển chữ có dấu <-> không dấu

bộ SQLSERVER nó ưu ái thiết kế cho việt nam mình xài thôi á ^^

tuanhaikh
04-08-2009, 16:45
ý của bạn tanky là sao mình chưa hiểu
Khi nhập vào chữ có dấu thì nó chuyển thành chữ không dấu cho chữ không dấu làm sao nó biết chuyểnthaanhf chữ có dấu nào
vd:

viet nam -> việt nam hay -> viết nam

[=========> Bổ sung bài viết <=========]

bạn bietdivedau bạn khẳng định là không có hảm như vậy hả bạn
vậy bạn có cách nào giúp mình xử lý cái tìm kiếm không dấu cso dấu này k ?
Chỉ giúp mình với

[=========> Bổ sung bài viết <=========]

Trong php thì mình đã xem cách làm rồi. Xem cũng hiểu được pahanf nào chắc cũng làm được còn asp.net mình chưa nghỉ ra .

Các bạn giúp mình với

[=========> Bổ sung bài viết <=========]

À mình hiểu ý bạn tanky rồi

VD: Trong csdl của mình có dòng dữ liệu là : việt nam
thì khi mình nhập vào viet nam thì nó không tìm được còn khi mình nhập vào việt nam hay v hay...thì tìm được

bietdivedau
04-08-2009, 17:40
khẳng định là không có cái hàm này.

Muốn có thì tự viết thôi:

a -> á,à,ả,ã,ạ,â,....
tương tự như vậy
á,à,ả,ã,ạ,â,.... -> a

khi gặp ký tự đó thì nó thay thế, nhưng mà cũng không hợp lý lắm, 1 chữ có biết bao nhiêu ký tự, mỗi ký tự có bao nhiêu dấu. Cứ thể tổ hợp chỉnh hợp lên thì nó chạy chậm rì

quên chuyên đó đi!

dinhanhency
04-08-2009, 19:01
khẳng định là không có cái hàm này.

Muốn có thì tự viết thôi:

a -> á,à,ả,ã,ạ,â,....
tương tự như vậy
á,à,ả,ã,ạ,â,.... -> a

khi gặp ký tự đó thì nó thay thế, nhưng mà cũng không hợp lý lắm, 1 chữ có biết bao nhiêu ký tự, mỗi ký tự có bao nhiêu dấu. Cứ thể tổ hợp chỉnh hợp lên thì nó chạy chậm rì

quên chuyên đó đi!

Tự viết hàm chuyển sang không dấu trong SQL.
Viết hàm này không có khó. Không ảnh hưởng đến xử lý nhiều.

tungoso
04-08-2009, 22:04
cái này cũng rất đơn giản mà, ý tưởng của bạn là đúng rồi đó, tại file xử lý tìm kiếm thì bạn chuyển toàn bộ từ khóa thành không dấu rồi tìm trong ten_khong_dau là ok, mình hiện cũng đang dùng cách này để khi tìm có dấu hay không dấu sẽ cho ra cùng kết quả. Còn hàm thì như bietdivedau đã nói, tự viết trên nguyên tắc replace a,â,ă,.... bằng a, làm đủ cho các nguyên âm (a,e,i,...) và đ nữa là đc.

tuanhaikh
05-08-2009, 08:14
Mình đã nghiên cứu nhưng vẫn chưa viết được bằng cách dùng hàm replace.
Bạn nào đã viết rồi thì post lên cho mình xin code được k ?
Code VB càn tốt tại mình đang viết bằng VB

Cảm ơn nhiều

bietdivedau
05-08-2009, 08:23
suy nghĩ nhiều 1 chút sẽ làm ra thôi. có vậy mà đã nhờ vả sau này còn nhiều ct phức tạp hơn đó bạn

tuanhaikh
05-08-2009, 08:32
Cảm ơn lời khuyên của bạn nhưng quả thật mình cũng làm lập trình lâu rồi, những cái khác mình có thể tự nghĩ ra rồi làm được. Còn cái này mình quả thật đang bí. Chưa biết đường đi như thế nào cả. Nếu quả thật mình không bí thì mình cũng chẳng làm phiền các bạn làm gì đâu. bạn thông cảm

xxtkidxx
05-08-2009, 17:23
Bạn tham khảo thử cái hàm chuyển có dấu sang không dấu này trên VB.NET :)

Public Function ChuyenKhongDau(ByVal strVietNamese As String) As String
Dim FindText As String = "áàảãạâấầẩẫậăắằẳẵặđé èẻẽẹêếềểễệíìỉĩịóòỏõ ôốồổỗộơớờởỡợúùủũụư ứừửữựýỳỷỹỵÁÀẢÃẠÂẤẦ ẪẬĂẮẰẲẴẶĐÉÈẺẼẸÊẾỀ ỄỆÍÌỈĨỊÓÒỎÕỌÔỐỒỔỖỘƠ ỚỜỞỠỢÚÙỦŨỤƯỨỪỬỮỰÝỲ ỸỴ"
Dim ReplText As String = "aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiioooooooooooooooo ouuuuuuuuuuuyyyyyAAAAAAAAAAAAAAAAADEEEEEEEEEEEIIII IOOOOOOOOOOOOOOOOOUUUUUUUUUUUYYYYY"
Dim index As Integer = -1
While (InlineAssignHelper(index, strVietNamese.IndexOfAny(FindText.ToCharArray()))) <> -1
Dim index2 As Integer = FindText.IndexOf(strVietNamese(index))
strVietNamese = strVietNamese.Replace(strVietNamese(index), ReplText(index2))
End While
Return strVietNamese
End Function

tuanhaikh
18-11-2009, 11:34
Cái InlineAssignHelper có phải khai báo thư viện gì không bạn

vb nó báo lỗi chỗ này

QuanN
19-11-2009, 07:13
'''
''' Strips accents off words
'''
Public Shared Function StripDiacritics(ByVal accented As String) As String
    Dim regex As New Regex("\p{IsCombiningDiacriticalMarks}+")
   
    Dim strFormD As String = accented.Normalize(NormalizationForm.FormD)
    Return regex.Replace(strFormD, String.Empty).Replace("đ"c, "d"c).Replace("Đ"c, "D"c)
End Function

hocnvbg
28-03-2011, 14:58
Đang tìm kiếm linh tinh ra cái này có lẽ post đoạn này có ích ! cho những ai cần ko biết có chưa
SQL Cái này đi coppy ở đâu không nhớ !
CREATE FUNCTION [dbo].[fuChuyenCoDauThanhKhongDau]

(

@strInput NVARCHAR(4000)

)

RETURNS NVARCHAR(4000)

AS

BEGIN

IF @strInput IS NULL RETURN @strInput

IF @strInput = '' RETURN @strInput

DECLARE @RT NVARCHAR(4000)

DECLARE @SIGN_CHARS NCHAR(136)

DECLARE @UNSIGN_CHARS NCHAR (136)



SET @SIGN_CHARS = N'ăâđêôơưàảãạáằẳẵặắầẩ ậấèẻẽẹéềểễệế

ìỉĩịíòỏõọóồổỗộốờởỡ ớùủũụúừửữựứỳỷỹỵý

ĂÂĐÊÔƠƯÀẢÃẠÁẰẲẴẶẮẦẨẪ ẬẤÈẺẼẸÉỀỂỄỆẾÌỈĨỊÍ

ÒỎÕỌÓỒỔỖỘỐỜỞỠỢỚÙỦŨ ÚỪỬỮỰỨỲỶỸỴÝ'

+NCHAR(272)+ NCHAR(208)

SET @UNSIGN_CHARS = N'aadeoouaaaaaaaaaaaaaaaeeeeeeeeee

iiiiiooooooooooooooouuuuuuuuuuyyyyy

AADEOOUAAAAAAAAAAAAAAAEEEEEEEEEEIIIII

OOOOOOOOOOOOOOOUUUUUUUUUUYYYYYDD'

DECLARE @COUNTER int

DECLARE @COUNTER1 int

SET @COUNTER = 1



WHILE (@COUNTER <=LEN(@strInput))

BEGIN

SET @COUNTER1 = 1

--Tìm trong chuỗi mẫu

WHILE (@COUNTER1 <=LEN(@SIGN_CHARS)+1)

BEGIN

IF UNICODE(SUBSTRING(@SIGN_CHARS, @COUNTER1,1))

= UNICODE(SUBSTRING(@strInput,@COUNTER ,1) )

BEGIN

IF @COUNTER=1

SET @strInput = SUBSTRING(@UNSIGN_CHARS, @COUNTER1,1)

+ SUBSTRING(@strInput, @COUNTER+1,LEN(@strInput)-1)

ELSE

SET @strInput = SUBSTRING(@strInput, 1, @COUNTER-1)

+SUBSTRING(@UNSIGN_CHARS, @COUNTER1,1)

+ SUBSTRING(@strInput, @COUNTER+1,LEN(@strInput)- @COUNTER)

BREAK

END

SET @COUNTER1 = @COUNTER1 +1

END

--Tìm tiếp

SET @COUNTER = @COUNTER +1

END

SET @strInput = replace(@strInput,' ','')

RETURN @strInput

END

----------------
Cái này C#

//---------------------------------------
public string[,] sArray = new string[14, 18];
//Khởi tạo mảng
public void InitArrayToneMarks()
{
byte i, j;
string sString = "aAeEoOuUiIdDyY";
string LC_a = "áàạảãâấầậẩẫăắằặẳẵ";
string UC_A = "ÁÀẠẢÃÂẤẦẬẨẪĂẮẰẶẲẴ";
string LC_e = "éèẹẻẽêếềệểễeeeeee";
string UC_E = "ÉÈẸẺẼÊẾỀỆỂỄEEEEEE";
string LC_o = "óòọỏõôốồộổỗơớờợởỡ";
string UC_O = "ÓÒỌỎÕÔỐỒỘỔỖƠỚỜỢỞỠ";
string LC_u = "úùụủũưứừựửữuuuuuu";
string UC_U = "ÚÙỤỦŨƯỨỪỰỬỮUUUUUU";
string LC_i = "íìịỉĩiiiiiiiiiiii";
string UC_I = "ÍÌỊỈĨIIIIIIIIIIII";
string LC_d = "đdddddddddddddddd";
string UC_D = "ĐDDDDDDDDDDDDDDDD";
string LC_y = "ýỳỵỷỹyyyyyyyyyyyy";
string UC_Y = "ÝỲỴỶỸYYYYYYYYYYYY";
for (i = 0; i < 14; i++)
sArray[i, 0] = sString.Substring(i, 1);
for (j = 1; j < 18; j++)
for (i = 1; i < 18; i++)
{
sArray[0, i] = LC_a.Substring(i - 1, 1);
sArray[1, i] = UC_A.Substring(i - 1, 1);
sArray[2, i] = LC_e.Substring(i - 1, 1);
sArray[3, i] = UC_E.Substring(i - 1, 1);
sArray[4, i] = LC_o.Substring(i - 1, 1);
sArray[5, i] = UC_O.Substring(i - 1, 1);
sArray[6, i] = LC_u.Substring(i - 1, 1);
sArray[7, i] = UC_U.Substring(i - 1, 1);
sArray[8, i] = LC_i.Substring(i - 1, 1);
sArray[9, i] = UC_I.Substring(i - 1, 1);
sArray[10, i] = LC_d.Substring(i - 1, 1);
sArray[11, i] = UC_D.Substring(i - 1, 1);
sArray[12, i] = LC_y.Substring(i - 1, 1);
sArray[13, i] = UC_Y.Substring(i - 1, 1);
}
}
//Hàm loại bỏ dấu
public string RemoveToneMarks(string sSource)
{
InitArrayToneMarks();
if (sSource == "") return "";
byte i, j;
for (j = 0; j < 14; j++)
{
for (i = 1; i < 18; i++)
{
sSource = sSource.Replace(sArray[j, i], sArray[j, 0]);
}
}
return sSource;
}