数据库中如何判断有么有中文

数据库中的一行数据,现在要处理这个数据,该如何判断其中有么有中文呢?
也想过把数据从数据库取出来在应用程序中判断,不晓得该如何写判断??

阅读 3.8k
4 个回答

如果需要对这些数据实时处理,对实时性要求高
可以尝试在数据表中多加一个字段 is_cn(是否有中文,0:否,1:是)
然后批量生成一下这个字段

严格点是判断编码范围
更简便的方法是利用utf8编码里中文的LENGTH()和CHAR_LENGTH()结果不一样来做
image.png
当然如果你这个字段可能是其他也是占用多个字节的语言,那就不那么好用了。

严格的都是需要判断字符串中各个字符所在编码范围,但这有一个前提,是字符串有合适的格式,即合适的编码
数据库本身是可以指定存储数据编码的,当前一般选用unicode编码,不过一些数控原始存储字符串编码不一定和这个编码兼容,就存在一个标准化编码,再判断的流程需求。

总之,大致的流程是

  1. 判断数据库字符编码
  2. 根据需求,把字符串的编码转化为兼容unicode编码
  3. 在unicode范围内进行字符串中各字符编码范围判断
  4. 存在unicode中对应汉字编码范围的,就认为有汉字(这个编码范围比较大,因为unicode中既编码了简体中文汉字,也编码了繁体汉字)

使用正则表达式进行判断。
匹配中文标点符号:
[\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b]
匹配这些符号 。 ; , : “ ”( ) 、 ? 《 》
匹配中文汉字:[\u4e00-\u9fa5]

func ContainsHan(str string) bool {
    han := regexp.MustCompile("^[\u4e00-\u9fa5]$")
    //如果要添加标点符号识别
    punc := regexp.MustCompile("^[\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b]$")

    // 遍历查找
    for _, v := range str {
        // golang中string的底层是byte类型,使用for-range来输出,避免中文乱码
        // for-range 返回的 value 是 rune 类型
        if han.MatchString(string(v)) || punc.MatchString(string(v)) {
            return true
        }
    }
    return false
}

建议在数据添加、修改前调用函数判断。
数据库可以设置一个字段,或者在文本前面设置一个标志位,用于判断是否包含。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题