mysql --中文轉漢語拼音,取首字母

直接上需求java

1.地點表以下mysql


原數據庫表是沒有FIRST_LETTER這個字段的。sql

需求:在原表的基礎上增長一列,要求該列是字段LOCATION_NAME拼音的首字母。數據庫

直接上SQL函數

Select location_id,location_name ,
ELT(INTERVAL(CONV(HEX(left(CONVERT(location_name USING gbk),1)),16,10),
0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,
0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,
0xCBFA,0xCDDA,0xCEF4,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 FIRST_LETTER 
FROM t_location

查出的結果以下編碼


很明顯如上的SQL能夠知足需求code

接着來分析如上SQL字符串

第一步,對漢字進行編碼,SQL以下io

SELECT CONVERT(location_name USING gbk) FROM t_location

運行結果以下class


第二步,取漢字(字符串)的第一個字,SQL以下

SELECT LEFT(CONVERT(location_name USING gbk),1) FROM t_location

運行結果以下


第三步,將第一個漢字轉換成十六進制編碼,SQL以下

SELECT HEX(LEFT(CONVERT(location_name USING gbk),1)) FROM t_location

運行結果以下


第四步,將十六進制轉成十進制,SQL以下

SELECT CONV(HEX(LEFT(CONVERT(location_name USING gbk),1)),16,10) FROM t_location

運行結果以下


第五步,SQL以下,

SELECT INTERVAL(CONV(HEX(LEFT(CONVERT(location_name USING gbk),1)),16,10),0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,
0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,
0xCBFA,0xCDDA,0xCEF4,0xD1B9,0xD4D1) FROM t_location

不知道以下這些數字有什麼用

0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,
0xCBFA,0xCDDA,0xCEF4,0xD1B9,0xD4D1

懂mysql中interval()函數的用法,可是不明白用在這裏是什麼意思。

運行結果以下


第六步,SQL以下

SELECT location_id,location_name,ELT(INTERVAL(CONV(HEX(LEFT(CONVERT(location_name USING gbk),1)),16,10),0xB0A1,
0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,
0xC8F6,0xCBFA,0xCDDA,0xCEF4,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')  FROM t_location

運行結果以下

這一步中,mysql的函數elt()意思明白。

總結:此次轉換流程第五步不明白,望高手見到了此帖子,指點一下!

補充:如上完成的是根據t_location表查詢出該字段,可是該字段並不存在於t_location表中。以下操做是使該字段存在於t_location表中。

步驟1:很明顯,給t_location表增長一個字段:first_letter。圖以下


步驟2:寫SQL

UPDATE t_location 
INNER JOIN(
Select location_id,location_name ,
ELT(INTERVAL(CONV(HEX(left(CONVERT(location_name USING gbk),1)),16,10),
0xB0A1,0xB0C5,0xB2C1,0xB4EE,0xB6EA,0xB7A2,0xB8C1,0xB9FE,0xBBF7,
0xBFA6,0xC0AC,0xC2E8,0xC4C3,0xC5B6,0xC5BE,0xC6DA,0xC8BB,0xC8F6,
0xCBFA,0xCDDA,0xCEF4,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 firstLetter 
FROM t_location) tl
ON tl.location_id = t_location.location_id
set t_location.first_letter = tl.firstLetter

該SQL其實是在上述第一個模塊中的第5步添加了更新。

相關文章
相關標籤/搜索