输入首字母就能查询数据库中汉字字段值的代码

时间:2021-08-13 07:32:33
数据库中有个汉字的姓名字段,如何编写一段代码实现输入首字母就能查询的功能?
比如:
数据库中有:王小丫,王小红,王大丫
程序中输入:W的查询结果为:王小丫,王小红,王大丫
           X的查询结果为:王小丫,王小红
           D的查询结果为:王大丫
           WX的查询结果为:王小丫
哪位高手指点一二

23 个解决方案

#1


有一个拼音控件可以实现
我邮箱8091858lin@163.com
我给你发过去

#2


建议在数据表中增加一个字段, 用于存放姓名字段的音头码, 这样便于查询。
这个音头码字段的值在姓名字段值发生变化时要及时更新。

#3


这样也不行,不可能在一个一个的输入,这样麻烦
而且楼主要实现的是W的查询结果为:王小丫,王小红,王大丫
           X的查询结果为:王小丫,王小红
           D的查询结果为:王大丫
           WX的查询结果为:王小丫
这样的话,你在一个一个的输入,客户肯定不接受,一个拼音控件就可以了!~
直接转换!~但是也要在数据表中添加字段!~

#4


OK发过去了!·

#5


你增加一个字段来保存拼音码不就OK了吗?先使用工具生成拼音码保存,然后模糊LIKE查询

#6


同意楼上

#7


晕了根我说的一个道理!~

#8


这样的话,你在一个一个的输入,客户肯定不接受,一个拼音控件就可以了!~

不明白你所说的。

“建议在数据表中增加一个字段, 用于存放姓名字段的音头码, 这样便于查询。
这个音头码字段的值在姓名字段值发生变化时要及时更新。”

你从哪里看出来这个实现办法会要求"一个一个的输入"啊?

#9


“建议在数据表中增加一个字段, 用于存放姓名字段的音头码, 这样便于查询。
这个音头码字段的值在姓名字段值发生变化时要及时更新。”

这个上面你没有说用第三方控件,如果不用第三空控件,你如何你实现数据表中存放姓名字段的音头码呢?可能是我理解错了!~

#10


只要是汉字的字段都要这么查的,每个字段增加个助记码之类的东西那不是数据两大多了吗?

#11


deansroom(丁樵方玉),我注册帐户的信箱好久没去结果被注销了??
麻烦您发到lfm19821229@163.com好吗?

#12


我给你的油箱发信了,只要回复就好.呵呵.

#13


弄一个拼音表可以吗,联合查询。

#14


GB2312-80信息交换编码表共收录了汉字和图形符号7445个,将这些汉字和图形符号排列在94行*94列的二维表中,表的行称为区,表的列称为位,区和位构成汉字的区位码。常用汉字位于16-55区,按汉字的拼音顺序排列,计算机处理汉字是以内码的形式表示的,内码和区位码的关系为:汉字内码=汉字区位码+A0A0H

第一个汉字为“啊”,位于16区1位,区位码为0001 0000 0000 0001,内码为1011 0000 1010 0001,以十六进制表示为B0A1H,拼音首字符为A的汉字内码为B0A1H-B0C4H。只要得到汉字的内码,就可以知道其拼音首字符。

下面给一段例子:
    
    unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, DBCtrls, DB, DBTables, Grids, DBGrids;

type
  TForm1 = class(TForm)
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Table1: TTable;
    DBNavigator1: TDBNavigator;
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    function GetPY(hzchar:string):char;//返回汉字的拼音首字符
    procedure LocatebyPY(t1:Ttable;Fieldname:string;PYstr:string);//检查符合条件的记录
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.GetPY(hzchar:string):char;
begin
  case WORD(hzchar[1])shl(8)+WORD(hzchar[2]) of
    $B0A1..$B0C4 : result:='A';
    $B0C5..$B2C0 : result:='B';
    $B2C1..$B4ED : result:='C';
    $B4EE..$B6E9 : result:='D';
    $B6EA..$B7A1 : result:='E';
    $B7A2..$B8C0 : result:='F';
    $B9C1..$B9FD : result:='G';
    $B9FE..$BBF6 : result:='H';
    $BBF7..$BFA5 : result:='J';
    $BFA6..$C0AB : result:='K';
    $C0AC..$C2E7 : result:='L';
    $C2E8..$C4C2 : result:='M';
    $C4C3..$C5B5 : result:='N';
    $C5B6..$C5BD : result:='O';
    $C5BE..$C6D9 : result:='P';
    $C6DA..$C8BA : result:='Q';
    $C8BB..$C8F5 : result:='R';
    $C8F6..$CBF9 : result:='S';
    $CBFA..$CDD9 : result:='T';
    $CDDA..$CEF3 : result:='W';
    $CEF4..$D188 : result:='X';
    $D189..$D4D0 : result:='Y';
    $D4D1..$D7F9 : result:='Z';
  else 
    result:=char(0);
  end;
end;
procedure TForm1.LocatebyPY(t1:Ttable;Fieldname:string;PYstr:string);
label  NotFound;
var
  j:integer;
  hzchar:string;
  hzstr:array[0..100] of char;
begin
  while not t1.eof do
    begin
      strcopy(hzstr,pchar(t1.fieldbyname(fieldname).asstring));
      for j:=0 to length(PYstr)-1 do
        begin
          hzchar:=hzstr[2*j]+hzstr[2*j+1];
          if (PYstr[j+1]<>'?')and(uppercase(PYstr[j+1])<>GetPY(hzchar))
            then
              goto NotFound;
        end;
      if messageDlg('已经找到,继续查找?',mtConfirmation,[mbYes,mbNo],0)<>mrYes then
        exit;
      NotFound:
      t1.next;
    end;
    showmessage('查找结束,没有找到!');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  LocateByPY(table1,'SZXB',edit1.text);
end;

end.


#15


楼上的方法好象只能查询一个字母.
并且有错误吧.
$CEF4..$D188 : result:='X';
$D189..$D4D0 : result:='Y';
应该是
$CEF4..$D1B8 : result:='X';
$D1B9..$D4D0 : result:='Y';

#16


按区位码区间来查是不好的。只有一级字库是按拼音排序的。

#17


正如ahjoe(强哥)所言,二级字库只能用查表法来获取它们的拼音了。

#18


那段代码可以查询,单个的字母可以,两个就查不准了.

#19


up

#20


这个东西如果要实现你的二级字库查询,只能在数据表多建一个字段,然后才能实现你的功能,我不是给你拼音控件了吗?不会安装????????不会用????

#21


我见过一个模糊拼音查询的,就是:
比如有: 往下压;往下按;往上提 三个记录
你输入 WX
显示: 
往下压
往下按
你输入:WXY 就可以准确定位到:
往下压

就是不知道是使用的数据库功能还是控件,等我回去用SPY++看看就知道了

#22


deansroom(丁樵方玉),我没收到语音控件,可能是出什么问题了。
lfm19821229@163.com

#23


rcyboom(BOOM) ,无论是数据库功能还是控件,能实现输入字母查询就行.

#1


有一个拼音控件可以实现
我邮箱8091858lin@163.com
我给你发过去

#2


建议在数据表中增加一个字段, 用于存放姓名字段的音头码, 这样便于查询。
这个音头码字段的值在姓名字段值发生变化时要及时更新。

#3


这样也不行,不可能在一个一个的输入,这样麻烦
而且楼主要实现的是W的查询结果为:王小丫,王小红,王大丫
           X的查询结果为:王小丫,王小红
           D的查询结果为:王大丫
           WX的查询结果为:王小丫
这样的话,你在一个一个的输入,客户肯定不接受,一个拼音控件就可以了!~
直接转换!~但是也要在数据表中添加字段!~

#4


OK发过去了!·

#5


你增加一个字段来保存拼音码不就OK了吗?先使用工具生成拼音码保存,然后模糊LIKE查询

#6


同意楼上

#7


晕了根我说的一个道理!~

#8


这样的话,你在一个一个的输入,客户肯定不接受,一个拼音控件就可以了!~

不明白你所说的。

“建议在数据表中增加一个字段, 用于存放姓名字段的音头码, 这样便于查询。
这个音头码字段的值在姓名字段值发生变化时要及时更新。”

你从哪里看出来这个实现办法会要求"一个一个的输入"啊?

#9


“建议在数据表中增加一个字段, 用于存放姓名字段的音头码, 这样便于查询。
这个音头码字段的值在姓名字段值发生变化时要及时更新。”

这个上面你没有说用第三方控件,如果不用第三空控件,你如何你实现数据表中存放姓名字段的音头码呢?可能是我理解错了!~

#10


只要是汉字的字段都要这么查的,每个字段增加个助记码之类的东西那不是数据两大多了吗?

#11


deansroom(丁樵方玉),我注册帐户的信箱好久没去结果被注销了??
麻烦您发到lfm19821229@163.com好吗?

#12


我给你的油箱发信了,只要回复就好.呵呵.

#13


弄一个拼音表可以吗,联合查询。

#14


GB2312-80信息交换编码表共收录了汉字和图形符号7445个,将这些汉字和图形符号排列在94行*94列的二维表中,表的行称为区,表的列称为位,区和位构成汉字的区位码。常用汉字位于16-55区,按汉字的拼音顺序排列,计算机处理汉字是以内码的形式表示的,内码和区位码的关系为:汉字内码=汉字区位码+A0A0H

第一个汉字为“啊”,位于16区1位,区位码为0001 0000 0000 0001,内码为1011 0000 1010 0001,以十六进制表示为B0A1H,拼音首字符为A的汉字内码为B0A1H-B0C4H。只要得到汉字的内码,就可以知道其拼音首字符。

下面给一段例子:
    
    unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, DBCtrls, DB, DBTables, Grids, DBGrids;

type
  TForm1 = class(TForm)
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    Table1: TTable;
    DBNavigator1: TDBNavigator;
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    function GetPY(hzchar:string):char;//返回汉字的拼音首字符
    procedure LocatebyPY(t1:Ttable;Fieldname:string;PYstr:string);//检查符合条件的记录
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.GetPY(hzchar:string):char;
begin
  case WORD(hzchar[1])shl(8)+WORD(hzchar[2]) of
    $B0A1..$B0C4 : result:='A';
    $B0C5..$B2C0 : result:='B';
    $B2C1..$B4ED : result:='C';
    $B4EE..$B6E9 : result:='D';
    $B6EA..$B7A1 : result:='E';
    $B7A2..$B8C0 : result:='F';
    $B9C1..$B9FD : result:='G';
    $B9FE..$BBF6 : result:='H';
    $BBF7..$BFA5 : result:='J';
    $BFA6..$C0AB : result:='K';
    $C0AC..$C2E7 : result:='L';
    $C2E8..$C4C2 : result:='M';
    $C4C3..$C5B5 : result:='N';
    $C5B6..$C5BD : result:='O';
    $C5BE..$C6D9 : result:='P';
    $C6DA..$C8BA : result:='Q';
    $C8BB..$C8F5 : result:='R';
    $C8F6..$CBF9 : result:='S';
    $CBFA..$CDD9 : result:='T';
    $CDDA..$CEF3 : result:='W';
    $CEF4..$D188 : result:='X';
    $D189..$D4D0 : result:='Y';
    $D4D1..$D7F9 : result:='Z';
  else 
    result:=char(0);
  end;
end;
procedure TForm1.LocatebyPY(t1:Ttable;Fieldname:string;PYstr:string);
label  NotFound;
var
  j:integer;
  hzchar:string;
  hzstr:array[0..100] of char;
begin
  while not t1.eof do
    begin
      strcopy(hzstr,pchar(t1.fieldbyname(fieldname).asstring));
      for j:=0 to length(PYstr)-1 do
        begin
          hzchar:=hzstr[2*j]+hzstr[2*j+1];
          if (PYstr[j+1]<>'?')and(uppercase(PYstr[j+1])<>GetPY(hzchar))
            then
              goto NotFound;
        end;
      if messageDlg('已经找到,继续查找?',mtConfirmation,[mbYes,mbNo],0)<>mrYes then
        exit;
      NotFound:
      t1.next;
    end;
    showmessage('查找结束,没有找到!');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  LocateByPY(table1,'SZXB',edit1.text);
end;

end.


#15


楼上的方法好象只能查询一个字母.
并且有错误吧.
$CEF4..$D188 : result:='X';
$D189..$D4D0 : result:='Y';
应该是
$CEF4..$D1B8 : result:='X';
$D1B9..$D4D0 : result:='Y';

#16


按区位码区间来查是不好的。只有一级字库是按拼音排序的。

#17


正如ahjoe(强哥)所言,二级字库只能用查表法来获取它们的拼音了。

#18


那段代码可以查询,单个的字母可以,两个就查不准了.

#19


up

#20


这个东西如果要实现你的二级字库查询,只能在数据表多建一个字段,然后才能实现你的功能,我不是给你拼音控件了吗?不会安装????????不会用????

#21


我见过一个模糊拼音查询的,就是:
比如有: 往下压;往下按;往上提 三个记录
你输入 WX
显示: 
往下压
往下按
你输入:WXY 就可以准确定位到:
往下压

就是不知道是使用的数据库功能还是控件,等我回去用SPY++看看就知道了

#22


deansroom(丁樵方玉),我没收到语音控件,可能是出什么问题了。
lfm19821229@163.com

#23


rcyboom(BOOM) ,无论是数据库功能还是控件,能实现输入字母查询就行.