背景:用户表中的name存的是用户名字的拼音和中文。
需求:名字去除掉所有的中文字符。
解决方案:
通过CONVERT(name USING ASCII)把中文转换为?,然后再进行替换。
##把所有中文字符替换为空字符串
UPDATE staff SET name = REPLACE(CONVERT(name USING ASCII),'?','');
##查询中文字符的转换过程
select name '原数据',CONVERT(name USING ASCII) '转换后', REPLACE(CONVERT(name USING ASCII),'?','') '结果'from staff;
引申问题:怎么判断字段包含中文字符
方法1:查询CONVERT(name USING ASCII)转换为后有?的数据。
select id,name from staff where locate('?',CONVERT(name USING ASCII));
##或者
select id,name from staff where position('?'in CONVERT(name USING ASCII));
方法2:通过正则表达式查询,'[^ -~]'或'e[4-9][0-9a-f]{4}'或者'^(..)*(E[4-9])'表示含中文。
SELECT name,
CASE name REGEXP '[^ -~]'
WHEN 1 THEN "包含中文字符"
ELSE "不包含中文字符"
END AS "判断是否是中文字符"
FROM staff;
#或
SELECT name,
CASE hex(name) REGEXP 'e[4-9][0-9a-f]{4}'
WHEN 1 THEN "包含中文字符"
ELSE "不包含中文字符"
END AS "判断是否是中文字符"
FROM staff;
#或
SELECT name,
CASE hex(name) REGEXP '^(..)*(E[4-9])'
WHEN 1 THEN "包含中文字符"
ELSE "不包含中文字符"
END AS "判断是否是中文字符"
FROM staff;
方法3:通过length()和char_length()返回值不同进行查询。
##当字符集为UTF-8,并且字符为中文时,length()和char_length()两个方法返回的结果不相同。
SELECT name FROM staff WHERE length(name) <> char_length(name);
参考链接:
(https://blog.csdn.net/u012731379/article/details/64125572)