Vien Dave +
Weibo Douban Instagram

关于MYSQL截断内容问题解决

##问题描述

##问题发生原因

##解决思路

##剔除UTF8字符串中4字节的字符方法

function removeByte4($str){
    return preg_replace('/[\xF0-\xF7].../s','', $str);
}

###性能 台式机,4.6W字符,0.006s,对程序性能影响基本可以忽略。

##扩展研究(其他的一些相关知识)

###问题底层原因

该问题是mysql本身的一个bug,可参考“Incorrect string value” error (1366) when inserting special characters“

###UTF8 4字节各系统的支持情况

###如何支持手机上的表情

此问题可参考mysql utf8mb4与emoji表情

###四种不同剔除utf8字符串中4字节字符的性能比对

测试机:普通pc; 测试文本:4.6W字节的中英文、特殊字符等混合;

####极快,推荐使用:0.006s

function removeByte4($str){
    return preg_replace('/[\xF0-\xF7].../s','', $str);
}

####较慢,参考用:0.2s

function removeByte4_2($str){
    return preg_replace('/[\x{10000}-\x{10FFFF}]/u','', $str);
}

####慢,但方便对特殊字符做不同替换:3s

function removeByte4_1($str){//移除utf-8编码中4字节及以上的字符
	mb_internal_encoding("UTF-8");
	$len = mb_strlen($str);
	
	$res = '';
	for($i=0;$i<$len;$i++){
		$t = mb_substr($str,$i,1);
		$res .= strlen($t)<=3?$t:'';
	}
	return $res;
}

####极慢,不具使用价值,仅参考:10.9s

function remove_4_byte($string) {
    $char_array = preg_split('/(?<!^)(?!$)/u', $string );
	$len = count($char_array);
    for($x=0;$x<$len;$x++) {
        if(strlen($char_array[$x])>3) {
            $char_array[$x] = "";
        }
    }
    return implode($char_array, "");
}

##结语

以上是对近期工作中碰到的一个MYSQL插入异常的原因及解决方法分析,分享给大家,转载请注明出处:Vien Dave’s Blog

近期文章