mysql 根据英文首字母来查询汉字函数

时间:2022-07-10 08:05:31
用mysql建立一个函数功能是:英文首字母来查询汉字

37 个解决方案

#1




具体一点要求是什么?

比如输入A,把表 tbl 中 字段 f 中以 ‘啊,挨,等开始的都选取出来?

#2


是的,正如所说

#3




你的表这个字段是什么字符集?

#4


varchar(50)

#5




是什么 字符集

show create table yourTable 看一下。

#6


| o_personnel | CREATE TABLE `o_personnel` (
  `A_Id` int(10) NOT NULL auto_increment,
  `A_UserName` varchar(50) default NULL,
  `A_PassWord` varchar(50) default NULL,
  `A_Name` varchar(50) default NULL,
  `A_Sex` varchar(50) default NULL,
  `A_IdCard` varchar(50) default NULL,
  `A_LeaveCase` mediumtext,
  PRIMARY KEY  (`A_Id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 |
 
A_UserName

#7




方法一:建一个拼音表 t_cosler ,存放每个字母开头的第一个汉字的编号和最后一个汉字的编号。
[code=BatchFile]+------+--------+-------+
| f_PY | cBegin | cEnd  |
+------+--------+-------+
| A    |  45217 | 45252 |
| B    |  45253 | 45760 |
.....
| Z    |  54481 | 55289 |
+------+--------+-------+[/code]

然后直接查询就行了。

mysql> create table t_cosler(
    ->  f_PY char primary key,
    ->  cBegin  SMALLINT UNSIGNED not null,
    ->  cEnd    SMALLINT UNSIGNED not null
    -> );
Query OK, 0 rows affected (0.09 sec)

mysql> insert into t_cosler values
    -> ('A',0xB0A1,0xB0C4),
    -> ('B',0xB0C5,0xB2C0),
    -> ('C',0xB2C1,0xB4ED),
    -> ('D',0xB4EE,0xB6E9),
    -> ('E',0xB6EA,0xB7A1),
    -> ('F',0xB7A2,0xB8C0),
    -> ('G',0xB8C1,0xB9FD),
    -> ('H',0xB9FE,0xBBF6),
    -> ('J',0xBBF7,0xBFA5),
    -> ('K',0xBFA6,0xC0AB),
    -> ('L',0xC0AC,0xC2E7),
    -> ('M',0xC2E8,0xC4C2),
    -> ('N',0xC4C3,0xC5B5),
    -> ('O',0xC5B6,0xC5BD),
    -> ('P',0xC5BE,0xC6D9),
    -> ('Q',0xC6DA,0xC8BA),
    -> ('R',0xC8BB,0xC8F5),
    -> ('S',0xC8F6,0xCBF9),
    -> ('T',0xCBFA,0xCDD9),
    -> ('W',0xCDDA,0xCEF3),
    -> ('X',0xCEF4,0xD188),
    -> ('Y',0xD1B9,0xD4D0),
    -> ('Z',0xD4D1,0xD7F9);
Query OK, 23 rows affected (0.16 sec)
Records: 23  Duplicates: 0  Warnings: 0

mysql> select * from  o_personnel;
+------+------------+
| A_Id | A_UserName |
+------+------------+
|    1 | 首先       |
|    2 | 检查       |
|    3 | 我们       |
|    4 | 的二       |
|    5 | 进制       |
|    6 | 是否       |
|    7 | 适合       |
|    8 | 你的       |
|    9 | 平台       |
+------+------------+
9 rows in set (0.00 sec)

mysql> select p.*,c.*
    -> from o_personnel p , t_cosler c
    -> where  CONV(HEX(left(A_UserName,1)),16,10) between c.cBegin and c.cEnd;
+------+------------+------+--------+-------+
| A_Id | A_UserName | f_PY | cBegin | cEnd  |
+------+------------+------+--------+-------+
|    4 | 的二       | D    |  46318 | 46825 |
|    2 | 检查       | J    |  48119 | 49061 |
|    5 | 进制       | J    |  48119 | 49061 |
|    8 | 你的       | N    |  50371 | 50613 |
|    9 | 平台       | P    |  50622 | 50905 |
|    1 | 首先       | S    |  51446 | 52217 |
|    6 | 是否       | S    |  51446 | 52217 |
|    7 | 适合       | S    |  51446 | 52217 |
|    3 | 我们       | W    |  52698 | 52979 |
+------+------------+------+--------+-------+
9 rows in set (0.00 sec)

mysql>


查S开头的
mysql> select p.*
    -> from o_personnel p , t_cosler c
    -> where  CONV(HEX(left(A_UserName,1)),16,10) between c.cBegin and c.cEnd
    -> and c.f_PY='S';
+------+------------+
| A_Id | A_UserName |
+------+------------+
|    1 | 首先       |
|    6 | 是否       |
|    7 | 适合       |
+------+------------+
3 rows in set (0.00 sec)

mysql>


方法二:不用这个t_cosler表,直接写个函数权限汉字得到拼音。

局限性: 以上方法,均依照汉字区位表来实现,对区位后面的复杂字,无法准确判断,对多音字无法准确判断。

方法三:从微软拼音中导出所有汉字的拼音表。

#8


好烦哦。
不过还是谢谢你。。


再等等有没有好点的答案。。。。

#9


有没有这样的函数呀(不要建表的)。

#10




不建表,但也未必不复杂。
mysql> SELECT *,
    ->  ELT(INTERVAL(CONV(HEX(left(A_UserName,1)),16,10),
    ->          0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,0
xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,0xCBFA,0xCDDA,0xCE
F4,0xD1B9,0xD4D1),
    ->          'A','B','C','D','E','F','G','H','J','K','L','M','N','O','P','Q',
'R','S','T','W','X','Y','Z') as PY
    -> from o_personnel;
+------+------------+------+
| A_Id | A_UserName | PY   |
+------+------------+------+
|    1 | 首先       | S    |
|    2 | 检查       | J    |
|    3 | 我们       | W    |
|    4 | 的二       | D    |
|    5 | 进制       | J    |
|    6 | 是否       | S    |
|    7 | 适合       | S    |
|    8 | 你的       | N    |
|    9 | 平台       | P    |
+------+------------+------+
9 rows in set (0.00 sec)

mysql>

#11


 谢谢 ACMAIN_CHM 给我解决了问题。
 呵呵
 结了


#12




借鉴了一下你提供的思路,简化了一下。

mysql> SELECT *,
    ->  CHAR(INTERVAL(CONV(HEX(left(A_UserName,1)),16,10),
    ->          0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,
    ->          0xBBF7,0xBBF7,0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,
    ->          0xC6DA,0xC8BB,0xC8F6,0xCBFA,0xCDDA,0xCDDA,0xCDDA,0xCEF4,
    ->          0xD1B9,0xD4D1)+64) as PY
    -> from o_personnel;
+------+------------+------+
| A_Id | A_UserName | PY   |
+------+------------+------+
|    1 | 首先       | S    |
|    2 | 检查       | J    |
|    3 | 我们       | W    |
|    4 | 的二       | D    |
|    5 | 进制       | J    |
|    6 | 是否       | S    |
|    7 | 适合       | S    |
|    8 | 你的       | N    |
|    9 | 平台       | P    |
+------+------------+------+
9 rows in set (0.00 sec)

mysql>

#13


看看

#14


好像有点深奥

#15


学习

#16


MARK

#17


初学,完全看不懂

#18


#19


学习一下啊

#20


不会

#21


学习一下啊

#22


小白,学习中!谢谢!

#23


谢谢

#24


很值得学习 

#25


学习了,看了有点晕

#26


DELIMITER $$;

DROP FUNCTION IF EXISTS `test`.`ChineseCode`$$

CREATE DEFINER=`root`@`localhost` FUNCTION `ChineseCode`(s varchar(50)) RETURNS char(1) CHARSET latin1
BEGIN
DECLARE hz_code int;
DECLARE hz_py char;
SET hz_code=ord(substring(s,1,1))*256+ord(substring(s,2,1))-65536;
select py into hz_py from base_code where hz_code>=base_code.hz1 and hz_code<=base_code.hz2;    
return hz_py;
END$$

DELIMITER ;$$


#27


很好,很强大

#28


学习了 路过看看那

#29


http://zhao4zhong1.download.csdn.net/可以下载拼音汉字对照表

#30


引用 12 楼 acmain_chm 的回复:
借鉴了一下你提供的思路,简化了一下。

SQL codemysql>SELECT*,->CHAR(INTERVAL(CONV(HEX(left(A_UserName,1)),16,10),->0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,->0xBBF7,0xBBF7,0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,->0xC6DA,0xC8BB,0xC8F6,0xCBFA,0xCDDA,0xCDDA,0xCDDA,0xCEF4,->0xD1B9,0xD4D1)+64)as PY->from o_personnel;+------+------------+------+| A_Id| A_UserName| PY|+------+------------+------+|1| 首先| S||2| 检查| J||3| 我们| W||4| 的二| D||5| 进制| J||6| 是否| S||7| 适合| S||8| 你的| N||9| 平台| P|+------+------------+------+9 rowsinset (0.00 sec)

mysql>



如果数据库编码是utf8,又怎么实现呢

#31


版主 太神了  这就是所谓的牛么?

#32


太深了,我也正在考虑如何用vfp来实现

#33


每个字母开头的第一个汉字的编号和最后一个汉字的编号  从哪儿得到啊??

#34


要查GBK的编码表

#35


今天正好要实现这个功能,但是我的数据库是utf8的查不到数据,
utf8该怎么解决

#36


学习了

#37


感觉有些深奥。

#1




具体一点要求是什么?

比如输入A,把表 tbl 中 字段 f 中以 ‘啊,挨,等开始的都选取出来?

#2


是的,正如所说

#3




你的表这个字段是什么字符集?

#4


varchar(50)

#5




是什么 字符集

show create table yourTable 看一下。

#6


| o_personnel | CREATE TABLE `o_personnel` (
  `A_Id` int(10) NOT NULL auto_increment,
  `A_UserName` varchar(50) default NULL,
  `A_PassWord` varchar(50) default NULL,
  `A_Name` varchar(50) default NULL,
  `A_Sex` varchar(50) default NULL,
  `A_IdCard` varchar(50) default NULL,
  `A_LeaveCase` mediumtext,
  PRIMARY KEY  (`A_Id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 |
 
A_UserName

#7




方法一:建一个拼音表 t_cosler ,存放每个字母开头的第一个汉字的编号和最后一个汉字的编号。
[code=BatchFile]+------+--------+-------+
| f_PY | cBegin | cEnd  |
+------+--------+-------+
| A    |  45217 | 45252 |
| B    |  45253 | 45760 |
.....
| Z    |  54481 | 55289 |
+------+--------+-------+[/code]

然后直接查询就行了。

mysql> create table t_cosler(
    ->  f_PY char primary key,
    ->  cBegin  SMALLINT UNSIGNED not null,
    ->  cEnd    SMALLINT UNSIGNED not null
    -> );
Query OK, 0 rows affected (0.09 sec)

mysql> insert into t_cosler values
    -> ('A',0xB0A1,0xB0C4),
    -> ('B',0xB0C5,0xB2C0),
    -> ('C',0xB2C1,0xB4ED),
    -> ('D',0xB4EE,0xB6E9),
    -> ('E',0xB6EA,0xB7A1),
    -> ('F',0xB7A2,0xB8C0),
    -> ('G',0xB8C1,0xB9FD),
    -> ('H',0xB9FE,0xBBF6),
    -> ('J',0xBBF7,0xBFA5),
    -> ('K',0xBFA6,0xC0AB),
    -> ('L',0xC0AC,0xC2E7),
    -> ('M',0xC2E8,0xC4C2),
    -> ('N',0xC4C3,0xC5B5),
    -> ('O',0xC5B6,0xC5BD),
    -> ('P',0xC5BE,0xC6D9),
    -> ('Q',0xC6DA,0xC8BA),
    -> ('R',0xC8BB,0xC8F5),
    -> ('S',0xC8F6,0xCBF9),
    -> ('T',0xCBFA,0xCDD9),
    -> ('W',0xCDDA,0xCEF3),
    -> ('X',0xCEF4,0xD188),
    -> ('Y',0xD1B9,0xD4D0),
    -> ('Z',0xD4D1,0xD7F9);
Query OK, 23 rows affected (0.16 sec)
Records: 23  Duplicates: 0  Warnings: 0

mysql> select * from  o_personnel;
+------+------------+
| A_Id | A_UserName |
+------+------------+
|    1 | 首先       |
|    2 | 检查       |
|    3 | 我们       |
|    4 | 的二       |
|    5 | 进制       |
|    6 | 是否       |
|    7 | 适合       |
|    8 | 你的       |
|    9 | 平台       |
+------+------------+
9 rows in set (0.00 sec)

mysql> select p.*,c.*
    -> from o_personnel p , t_cosler c
    -> where  CONV(HEX(left(A_UserName,1)),16,10) between c.cBegin and c.cEnd;
+------+------------+------+--------+-------+
| A_Id | A_UserName | f_PY | cBegin | cEnd  |
+------+------------+------+--------+-------+
|    4 | 的二       | D    |  46318 | 46825 |
|    2 | 检查       | J    |  48119 | 49061 |
|    5 | 进制       | J    |  48119 | 49061 |
|    8 | 你的       | N    |  50371 | 50613 |
|    9 | 平台       | P    |  50622 | 50905 |
|    1 | 首先       | S    |  51446 | 52217 |
|    6 | 是否       | S    |  51446 | 52217 |
|    7 | 适合       | S    |  51446 | 52217 |
|    3 | 我们       | W    |  52698 | 52979 |
+------+------------+------+--------+-------+
9 rows in set (0.00 sec)

mysql>


查S开头的
mysql> select p.*
    -> from o_personnel p , t_cosler c
    -> where  CONV(HEX(left(A_UserName,1)),16,10) between c.cBegin and c.cEnd
    -> and c.f_PY='S';
+------+------------+
| A_Id | A_UserName |
+------+------------+
|    1 | 首先       |
|    6 | 是否       |
|    7 | 适合       |
+------+------------+
3 rows in set (0.00 sec)

mysql>


方法二:不用这个t_cosler表,直接写个函数权限汉字得到拼音。

局限性: 以上方法,均依照汉字区位表来实现,对区位后面的复杂字,无法准确判断,对多音字无法准确判断。

方法三:从微软拼音中导出所有汉字的拼音表。

#8


好烦哦。
不过还是谢谢你。。


再等等有没有好点的答案。。。。

#9


有没有这样的函数呀(不要建表的)。

#10




不建表,但也未必不复杂。
mysql> SELECT *,
    ->  ELT(INTERVAL(CONV(HEX(left(A_UserName,1)),16,10),
    ->          0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,0
xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,0xCBFA,0xCDDA,0xCE
F4,0xD1B9,0xD4D1),
    ->          'A','B','C','D','E','F','G','H','J','K','L','M','N','O','P','Q',
'R','S','T','W','X','Y','Z') as PY
    -> from o_personnel;
+------+------------+------+
| A_Id | A_UserName | PY   |
+------+------------+------+
|    1 | 首先       | S    |
|    2 | 检查       | J    |
|    3 | 我们       | W    |
|    4 | 的二       | D    |
|    5 | 进制       | J    |
|    6 | 是否       | S    |
|    7 | 适合       | S    |
|    8 | 你的       | N    |
|    9 | 平台       | P    |
+------+------------+------+
9 rows in set (0.00 sec)

mysql>

#11


 谢谢 ACMAIN_CHM 给我解决了问题。
 呵呵
 结了


#12




借鉴了一下你提供的思路,简化了一下。

mysql> SELECT *,
    ->  CHAR(INTERVAL(CONV(HEX(left(A_UserName,1)),16,10),
    ->          0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,
    ->          0xBBF7,0xBBF7,0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,
    ->          0xC6DA,0xC8BB,0xC8F6,0xCBFA,0xCDDA,0xCDDA,0xCDDA,0xCEF4,
    ->          0xD1B9,0xD4D1)+64) as PY
    -> from o_personnel;
+------+------------+------+
| A_Id | A_UserName | PY   |
+------+------------+------+
|    1 | 首先       | S    |
|    2 | 检查       | J    |
|    3 | 我们       | W    |
|    4 | 的二       | D    |
|    5 | 进制       | J    |
|    6 | 是否       | S    |
|    7 | 适合       | S    |
|    8 | 你的       | N    |
|    9 | 平台       | P    |
+------+------------+------+
9 rows in set (0.00 sec)

mysql>

#13


看看

#14


好像有点深奥

#15


学习

#16


MARK

#17


初学,完全看不懂

#18


#19


学习一下啊

#20


不会

#21


学习一下啊

#22


小白,学习中!谢谢!

#23


谢谢

#24


很值得学习 

#25


学习了,看了有点晕

#26


DELIMITER $$;

DROP FUNCTION IF EXISTS `test`.`ChineseCode`$$

CREATE DEFINER=`root`@`localhost` FUNCTION `ChineseCode`(s varchar(50)) RETURNS char(1) CHARSET latin1
BEGIN
DECLARE hz_code int;
DECLARE hz_py char;
SET hz_code=ord(substring(s,1,1))*256+ord(substring(s,2,1))-65536;
select py into hz_py from base_code where hz_code>=base_code.hz1 and hz_code<=base_code.hz2;    
return hz_py;
END$$

DELIMITER ;$$


#27


很好,很强大

#28


学习了 路过看看那

#29


http://zhao4zhong1.download.csdn.net/可以下载拼音汉字对照表

#30


引用 12 楼 acmain_chm 的回复:
借鉴了一下你提供的思路,简化了一下。

SQL codemysql>SELECT*,->CHAR(INTERVAL(CONV(HEX(left(A_UserName,1)),16,10),->0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,->0xBBF7,0xBBF7,0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,->0xC6DA,0xC8BB,0xC8F6,0xCBFA,0xCDDA,0xCDDA,0xCDDA,0xCEF4,->0xD1B9,0xD4D1)+64)as PY->from o_personnel;+------+------------+------+| A_Id| A_UserName| PY|+------+------------+------+|1| 首先| S||2| 检查| J||3| 我们| W||4| 的二| D||5| 进制| J||6| 是否| S||7| 适合| S||8| 你的| N||9| 平台| P|+------+------------+------+9 rowsinset (0.00 sec)

mysql>



如果数据库编码是utf8,又怎么实现呢

#31


版主 太神了  这就是所谓的牛么?

#32


太深了,我也正在考虑如何用vfp来实现

#33


每个字母开头的第一个汉字的编号和最后一个汉字的编号  从哪儿得到啊??

#34


要查GBK的编码表

#35


今天正好要实现这个功能,但是我的数据库是utf8的查不到数据,
utf8该怎么解决

#36


学习了

#37


感觉有些深奥。