问题描述
mysql库中包含了中文字符(错误数据),导致程序异常
解决方法
使用sql语句排查出mysql表中某一字段的中文字符(异常值)
SELECT * FROM tablename WHERE length(column(字段名))!=char_length(column(字段名))
原理
length()和char_length()的区别
length() 该字符有多少个字节,即字节的长度;char_length()该字符有多少个字符,即字符个数
例:
select length("China"); ====> 5
select length("中国"); ====> 6
select char_length("China"); ====> 5
select char_length("中国"); ====> 2
因此如果字符为英文,length()和char_length()的结果相同,如果是中文字符,length()和char_length()结果不同
字符和字节区别
1)字符和字节并不是一个可比性的概念。
2)字符:在计算机和电信技术中,一个字符是一个单位的字形,类字形单位或符号,例如:一个字母,一个汉字,一个数字,一个单独的符号等都是一个字符
字节: 即byte,一个byte等于8bit位,每个bit位是0/1两种状态,即一个字节可以表示256个状态,计算机里用字节来作为最基本的存储单位。
3)
3.1 ASCII码中,一个英文字母(不区分大小写)占一个字节的空间,一个中文字符占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8为二进制数,换算为十进制。最小值为0,最大值为255.
3.2 UTF-8中,一个英文字符等于一个字节,一个中文(含繁体)等于三个字节
3.3 Unicode编码中,一个英文等于两个字节,一个中文(含繁体)等于两个字节
文本符号:英文标点占一个字节,中文标点占两个字节。举例:英文句号 “.” 占一个字节的大小,中文句号“。”占两个字节的大小
3.4 UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)
3.5 UTF-32编码中,世界上任何字符的存储都需要4个字节