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
`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 ;$$
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
学习了 路过看看那
#30
、
如果数据库编码是utf8,又怎么实现呢
如果数据库编码是utf8,又怎么实现呢
#31
版主 太神了 这就是所谓的牛么?
#32
太深了,我也正在考虑如何用vfp来实现
#33
每个字母开头的第一个汉字的编号和最后一个汉字的编号 从哪儿得到啊??
#34
要查GBK的编码表
#35
今天正好要实现这个功能,但是我的数据库是utf8的查不到数据,
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
`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 ;$$
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
、
如果数据库编码是utf8,又怎么实现呢
如果数据库编码是utf8,又怎么实现呢
#31
版主 太神了 这就是所谓的牛么?
#32
太深了,我也正在考虑如何用vfp来实现
#33
每个字母开头的第一个汉字的编号和最后一个汉字的编号 从哪儿得到啊??
#34
要查GBK的编码表
#35
今天正好要实现这个功能,但是我的数据库是utf8的查不到数据,
utf8该怎么解决
utf8该怎么解决
#36
学习了
#37
感觉有些深奥。