Mysql去除中文字符&判断字段是否有中文字符

背景:用户表中的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;
Mysql去除中文字符&判断字段是否有中文字符_第1张图片
转换的过程.png

引申问题:怎么判断字段包含中文字符
方法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)

你可能感兴趣的:(Mysql去除中文字符&判断字段是否有中文字符)