视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Mysql以utf8存储gbk输出的实现方法提供
2020-11-09 09:39:45 责编:小采
文档


Mysql以utf8存储gbk输出的实现方法提供

一个站有可能经历gb2312(gbk,big5)到utf8的转换过程,其中会遇到很多的问题。站点太庞大了怎么办呢,只能一步步来了。要是能在极少改动前端代码的情况下,先完成数据的转换将会使整件事情容易得多。经过几天测试终于发现,Mysql以utf8存储gbk输出是可以实现的。mysql4.1后都有个特性,可以指定当前客户端连接所使用的字符集,mysql默认都是latin1,或由mysql server端配置的字符集进行连接校对。我使用utf8_general_ci来创建字段。
DB:
SQL代码:
代码如下:
Create TABLE `table` (
`id` INT( 10 ) NOT NULL ,
`name` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
INDEX ( `g_id` )
) ENGINE = innodb CHARACTER SET utf8 COLLATE utf8_general_ci;

PHP:
存储操作指定使用utf8字符集进行连接校对,读取操作指定使用gbk字符集进行连接校对。


PHP代码:
代码如下:
// Select DB And Set Link Use UTF8
function _select_db_utf()
{
mysql_select_db($this->db_name, $this->db_link);


// init character
mysql_query("SET NAMES utf8", $this->db_link);
mysql_query("SET CHARACTER SET utf8", $this->db_link);
mysql_query("SET COLLATION_CONNECTION='utf8_general_ci'", $this->db_link);


return true;
}


// Select DB And Set Link Use GBK
function _select_db_gb()
{
mysql_select_db($this->db_name, $this->db_link);


// init character
mysql_query("SET NAMES gbk", $this->db_link);
mysql_query("SET CHARACTER SET gbk", $this->db_link);
mysql_query("SET COLLATION_CONNECTION='gbk_chinese_ci'", $this->db_link);


return true;
}
?>
需要注意几点:
1. mysql必须把gbk,gb2312,utf8等字符集编译进去。
2. 入库的数据内容必须保证是最正确的UTF8编码。
3. 存储和读取操作要指定正确的字符集进行连接校对。

要是前端代码操作数据入库不能以UTF8进行,则需要对字符进行转码了。(例如用AJAX提交的数据便是正确的UTF8,这时是不用转换的。)

因为mb_string是PHP所支持字符最全的,而iconv比它稍差一点,mb_string并不能完全支持一些特殊字符的转码,所以目前为止都没有完美的转码方法。

再次对mb_string和iconv进行比较:

mb_string:
1. 所支持字符最全
2. 内容自动识别编码,不需要确定原来字符的编码,但是执行效率比iconv差太多
3. $content = mb_convert_encoding($content, "UTF-8", "GBK,GB2312,BIG5");(顺序不同效果也有差异)

iconv:
1. 所支持字符不全
2. 需要确定原来字符的编码,但在确定编码的情况下执行效率比mb_convert_encoding高
3. $content = iconv("GBK", "UTF-8", $content);

下载本文
显示全文
专题