mysql 汉字转拼音 函数怎么写

y7429949 2013-08-26 04:46:21
想把表中了一列数据(汉字拼音混合)转为拼音(新增一列),数据量百万级,现在已经找到了一个汉字对应拼音库,字段为hz,py,本人对mysql 函数不熟,麻烦懂的帮忙写个函数。感激不尽。。。
...全文
342 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengfeng919 2013-08-27
  • 打赏
  • 举报
回复
为啥表设计的时候会想到用汉子呢,什么情况,分享一个不错站点,专注收藏数据库视频教程的网站,非常不错,我下载一部优化方面的视频,很经典:http://t.cn/zQSXkUL
知道就是你 2013-08-27
  • 打赏
  • 举报
回复
使用游标循环遍历,使用 substr() 函数截取单个汉子 并找到对应拼音 ,最后使用concat()函数 拼接并做修改操作,这是最麻烦最原始的办法!
y7429949 2013-08-27
  • 打赏
  • 举报
回复
引用 4 楼 JenMinZhang 的回复:
嘿嘿 ,既然有对应的汉子 与拼音 库了 ,写一个存储过程(相当于做个查询修改操作,查询拼音时需要一个汉子一个汉子去匹配)去实现,最原始的办法!
现在已经写好了对单行汉字转拼音的mysql函数,但不知道怎么写对整列进行操作,我现在的想法是建一个存储过程一行一行进行转换,不知道怎么取出一行汉字列记录同时将转换的拼音同时插入该行后面的列中。
y7429949 2013-08-27
  • 打赏
  • 举报
回复
引用 9 楼 ACMAIN_CHM 的回复:
写一个存储函数,对字符串中的每个汉字进行转换然后返回。
刚看到你回的一个帖子说不能用动态定义游标,修改了,不过还是不知道怎么对游标所指的当前行修改(不是修改的当前游标所指列) DELIMITER $$ CREATE PROCEDURE `message`.`hz2py_procs`(tablename VARCHAR(50)) BEGIN DECLARE py VARCHAR(3000); DECLARE hz VARCHAR(500); DECLARE allaccount INT; DECLARE cur1 CURSOR FOR SELECT MSGCONTENT FROM v_wondyfox; #DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; DROP VIEW IF EXISTS v_wondyfox ; SET @SQL=CONCAT("create view v_wondyfox as select * from ", tablename); PREPARE stmt1 FROM @SQL; EXECUTE stmt1 ; DEALLOCATE PREPARE stmt1; #DECLARE onlyCur CURSOR for select MSGCONTENT,hz2py from tablename; SELECT COUNT(*) INTO allaccount FROM v_wondyfox; OPEN onlyCur; FETCH onlyCur INTO hz; WHILE allaccount > 0 DO SET hz = (SELECT hz2py_func(hz)); #获得转为拼音后怎么在汉字列后插入拼音,汉字列为msgcontent(游标所指列),拼音列为hz2py #update tablename set hz2py = hz where CURRENT OF onlyCur; SET allaccount = allaccount - 1; FETCH onlyCur INTO hz; END WHILE; CLOSE onlyCur; END$$ DELIMITER ;
y7429949 2013-08-27
  • 打赏
  • 举报
回复
引用 9 楼 ACMAIN_CHM 的回复:
写一个存储函数,对字符串中的每个汉字进行转换然后返回。
DELIMITER $$ CREATE PROCEDURE `message`.`hz2py_procs`(tablename VARCHAR(50))#需要操作的表名 BEGIN DECLARE py VARCHAR(3000); DECLARE hz VARCHAR(500); DECLARE allaccount INT; DECLARE onlyCur CURSOR FOR SELECT MSGCONTENT FROM tablename; #取需要转换的列 SELECT COUNT(*) INTO allaccount FROM tablename;#取记录总数 OPEN onlyCur; FETCH onlyCur INTO hz; WHILE allaccount > 0 DO #这是我写的一个汉字转拼音的函数,单独执行该函数可以正确转换,现在就是不清楚怎么将转换的py插入对应取出的那一条记录后面(我在后面新增的了一列保存拼音) SET py = (SELECT hz2py_func(hz));#py接下来该怎么操作 SET allaccount = allaccount - 1; FETCH onlyCur INTO hz; END WHILE; CLOSE onlyCur; END$$ DELIMITER ; 麻烦版主帮忙看下,对数据库不太熟。没专门写过存储过程!!!
知道就是你 2013-08-27
  • 打赏
  • 举报
回复
嘿嘿 ,既然有对应的汉子 与拼音 库了 ,写一个存储过程(相当于做个查询修改操作,查询拼音时需要一个汉子一个汉子去匹配)去实现,最原始的办法!
ACMAIN_CHM 2013-08-27
  • 打赏
  • 举报
回复
写一个存储函数,对字符串中的每个汉字进行转换然后返回。
知道就是你 2013-08-27
  • 打赏
  • 举报
回复
高效办法一定有,只是我目前不知道,你给 斑竹 发私信 问一下,也许他知道!
y7429949 2013-08-27
  • 打赏
  • 举报
回复
引用 6 楼 JenMinZhang 的回复:
使用游标循环遍历,使用 substr() 函数截取单个汉子 并找到对应拼音 ,最后使用concat()函数 拼接并做修改操作,这是最麻烦最原始的办法!
额,游标怎么遍历?你说这是最麻烦的方法,请问还有什么效率高的方法么、?求助!!!
y7429949 2013-08-26
  • 打赏
  • 举报
回复
引用 2 楼 JenMinZhang 的回复:
可以通过JAVA程序实现 ,代码如下:


import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

public class GetPinYin {
	/**
	 * 返回汉字的拼音
	 * @param src
	 * 需要pinyin4j-2.5.0.jar
	 * @return
	 */
	public static String getPinYin(String src) {
		char[] t1 = null;
		t1 = src.toCharArray();
		String[] t2 = new String[t1.length];
		HanyuPinyinOutputFormat t3 = new HanyuPinyinOutputFormat();
		t3.setCaseType(HanyuPinyinCaseType.LOWERCASE);
		t3.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		t3.setVCharType(HanyuPinyinVCharType.WITH_V);
		String t4 = "";
		int t0 = t1.length;
		try {
			for (int i = 0; i < t0; i++) {
				// 判断是否为汉字字符
				if (java.lang.Character.toString(t1[i]).matches(
						"[\\u4E00-\\u9FA5]+")) {
					t2 = PinyinHelper.toHanyuPinyinStringArray(t1[i], t3);
					t2[0]=t2[0].substring(0,1).toUpperCase()+t2[0].substring(1,t2[0].length());
					t4 += t2[0];
				} else {
					t4 += java.lang.Character.toString(t1[i]);
				}
			}
			return t4;
		} catch (BadHanyuPinyinOutputFormatCombination e1) {
			e1.printStackTrace();
		}
		return t4;
	}

	/**
	 * 返回汉字拼音的首字母
	 * 
	 * @param str
	 * @return
	 */
	public static String getPinYinHeadChar(String str) {
		String convert = "";
		for (int j = 0; j < str.length(); j++) {
			char word = str.charAt(j);
			String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
			if (pinyinArray != null) {
				convert += pinyinArray[0].charAt(0);
			} else {
				convert += word;
			}
		}
		return convert;
	}

	//
	// public static String getCnASCII(String cnStr){
	// StringBuffer strBuf =  new   StringBuffer();
	// byte[] bGBK = cnStr.getBytes();
	// for(int i=0;i <bGBK.length;i++){
	// strBuf.append(Integer.toHexString(bGBK[i]&0xff));
	// }
	// return strBuf.toString();
	// }

	public static void main(String[] args) {
		System.out.println(getPinYin("陕西紫辰科技"));
		// 返回拼音的全拼样式
		System.out.println(getPinYinHeadChar("西安市"));
		// 返回拼音的首字母
		// System.out.println(getCnASCII("西安市"));
		// 返回拼音的ASCII
	}
}
额,我用的是C++,你说的这个我大概懂,是用的一个开源的类吧,我是想用Mysql里的函数来实现,请问能否帮帮忙?数据量比较大,效率也不能太低了。
知道就是你 2013-08-26
  • 打赏
  • 举报
回复
可以通过JAVA程序实现 ,代码如下:


import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

public class GetPinYin {
	/**
	 * 返回汉字的拼音
	 * @param src
	 * 需要pinyin4j-2.5.0.jar
	 * @return
	 */
	public static String getPinYin(String src) {
		char[] t1 = null;
		t1 = src.toCharArray();
		String[] t2 = new String[t1.length];
		HanyuPinyinOutputFormat t3 = new HanyuPinyinOutputFormat();
		t3.setCaseType(HanyuPinyinCaseType.LOWERCASE);
		t3.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		t3.setVCharType(HanyuPinyinVCharType.WITH_V);
		String t4 = "";
		int t0 = t1.length;
		try {
			for (int i = 0; i < t0; i++) {
				// 判断是否为汉字字符
				if (java.lang.Character.toString(t1[i]).matches(
						"[\\u4E00-\\u9FA5]+")) {
					t2 = PinyinHelper.toHanyuPinyinStringArray(t1[i], t3);
					t2[0]=t2[0].substring(0,1).toUpperCase()+t2[0].substring(1,t2[0].length());
					t4 += t2[0];
				} else {
					t4 += java.lang.Character.toString(t1[i]);
				}
			}
			return t4;
		} catch (BadHanyuPinyinOutputFormatCombination e1) {
			e1.printStackTrace();
		}
		return t4;
	}

	/**
	 * 返回汉字拼音的首字母
	 * 
	 * @param str
	 * @return
	 */
	public static String getPinYinHeadChar(String str) {
		String convert = "";
		for (int j = 0; j < str.length(); j++) {
			char word = str.charAt(j);
			String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
			if (pinyinArray != null) {
				convert += pinyinArray[0].charAt(0);
			} else {
				convert += word;
			}
		}
		return convert;
	}

	//
	// public static String getCnASCII(String cnStr){
	// StringBuffer strBuf =  new   StringBuffer();
	// byte[] bGBK = cnStr.getBytes();
	// for(int i=0;i <bGBK.length;i++){
	// strBuf.append(Integer.toHexString(bGBK[i]&0xff));
	// }
	// return strBuf.toString();
	// }

	public static void main(String[] args) {
		System.out.println(getPinYin("陕西紫辰科技"));
		// 返回拼音的全拼样式
		System.out.println(getPinYinHeadChar("西安市"));
		// 返回拼音的首字母
		// System.out.println(getCnASCII("西安市"));
		// 返回拼音的ASCII
	}
}
y7429949 2013-08-26
  • 打赏
  • 举报
回复
有没有人帮帮忙啊,知道怎么转单个汉字,但整列转拼音不会,对mysql 函数不知道怎么写

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧