位置: 编程技术 - 正文

MySQL中文乱码问题的解决第1/2页(mysql中文乱码解决)

编辑:rootadmin
转自: 4.1 对多语言的支持有了很大变化 (这导致了问题的出现); 尽管大部分的地方 (包括个人使用和主机提供商),MySQL 3 仍然占主导地位;但 MySQL 4.1 是 MySQL 官方推荐的数据库,已经有主机提供商开始提供并将会越来越多; 许多 PHP 程序以 MySQL 作为默认的数据库管理软件,但它们一般不区分 MySQL 4.1 与 4.1 以下版本的区别,笼统地称“MySQL 3.xx.xx 以上版本”就满足安装需求了; 因为 latin1 在许多地方 (下边会详细描述具体是哪些地方) 作为默认的字符集,成功的蒙蔽了许多 PHP 程序的开发者和用户,掩盖了在中文等语言环境下会出现的问题; 简单的说,MySQL 自身的变化和使用 MySQL 的 PHP 程序对此忽略,导致了问题的出现和复杂化,而由于大部分用户使用的是英文,使这种问题不被重视。这里提到的 PHP 程序,主要就 WordPress 而言。 MySQL 4.1 字符集支持的原理MySQL 4.1 对于字符集的指定可以细化到一台机器上安装的 MySQL,其中的一个数据库,其中的一张表,其中的一栏,应该用什么字符集。但是,传统的 Web 程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢?编译 MySQL 时,指定了一个默认的字符集,这个字符集是 latin1; 安装 MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的; 启动 mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的; 此时 character_set_server 被设定为这个默认的字符集; 当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为 character_set_server; 当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集; 在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集; 当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集; 这个字符集就是数据库中实际存储数据采用的字符集,mysqldump 出来的内容就是这个字符集下的; 简单的总结一下,如果什么地方都不修改,那么所有的数据库的所有表的所有栏位的都用 latin1 存储,不过我们如果安装 MySQL,一般都会选择多语言支持,也就是说,安装程序会自动在配置文件中把 default_character_set 设置为 UTF-8,这保证了缺省情况下,所有的数据库的所有表的所有栏位的都用 UTF-8 存储。当一个 PHP 程序与 MySQL 建立连接后,这个程序发送给 MySQL 的数据采用的是什么字符集?MySQL 无从得知 (它最多只能猜测),所以 MySQL 4.1 要求客户端必须指定这个字符集,也就是 character_set_client,MySQL 的怪异之处在于,得到的这个字符集并不立即转换为存储在数据库中的那个字符集,而是先转换为 character_set_connection 变量指定的一个字符集;这个 connection 层究竟有什么用我不大明白,但转换为 character_set_connection 的这个字符集之后,还要转换为数据库默认的字符集,也就是说要经过两次转换;当这个数据被输出时,又要由数据库默认的字符集转换为 character_set_results 指定的字符集。一个典型的环境典型的环境以我自己的电脑上安装的 MySQL 4.1 为例,我自己的电脑上安装着 Apache 2,PHP 5 和 WordPress 1.5.1.3,MySQL 配置文件中指定了 default_character_set 为 utf8。于是问题出现了:WordPress 按照默认情况安装,所以所有的表都用 UTF-8 存储数据; WordPress 默认采用的浏览字符集是 UTF-8 (Options->Reading 中设置),因此所有 WP 页面的 meta 中会说明 charset 是 utf-8; 所以浏览器会以 utf-8 方式显示所有的 WP 页面;这样一来 Write 的所有 Post,和 Comment 都会以 UTF-8 格式从浏览器发送给 Apache,再由 Apache 交给 PHP; 所以 WP 从所有的表单中得到的数据都是 utf-8 编码的;WP 不加转换的直接把这些数据发送给 MySQL; MySQL 默认设置的 character_set_client 和 character_set_connection 都是 latin1,此时怪异的事情发生了,实际上是 utf-8 格式的数据,被“当作 latin1”转换成……居然还是转换成 latin1,然后再由这个 latin1 转换成 utf-8,这么两次转换,有一部分 utf-8 的字符就丢失了,变成 ??,最后输出的时候 character_set_results 默认是 latin1,也就输出为奇怪的东西了。 最神奇的还不是这个,如果 WordPress 中设置以 GB 格式阅读,那么 WP 发送给 MySQL 的 GB 编码的数据,被“当作 latin1”转换后,存进数据库的是一种奇怪的格式 (真的是奇怪的格式,mysqldump 出来就能发现,无论当作 utf-8 还是当作 gb 来读都是乱码),但如果这种格式以 latin1 输出出来,居然又能变回 GB!这会导致什么现象呢?WP 如果使用 MySQL 4.1 数据库,把编码改用 GB 就正常了,可惜,这种正常只是貌似正常。如何解决问题如果你已经不耐烦了 (几乎是肯定的),google 一下,会发现绝大部分的解答是,query 之前先执行一下:SET NAMES 'utf8',没错,这是解决方案,但本文的目的是说明,这为什么是解决方案。要保证结果正确,必须保证数据表采用的格式是正确的,也就是说,至少能够存放所有的汉字,那么我们只有两种选择,gbk 或者 utf-8,下面讨论 utf-8 的情况。因为配置文件设置的 default_character_set 是 utf8,数据表默认采用的就是 utf-8 建立的。这也应该是所有采用 MySQL 4.1 的主机提供商应该采用的配置。所以我们要保证的只是客户端与 MySQL 交互之间指定编码的正确。这只有两种可能,客户端以 gb 格式发送数据,或者以 utf-8 格式发送数据。如果以 gb 格式发送:SET character_set_client='gb'SET character_set_connection='utf8' 或者 SET character_set_connection='gb'都是可以的,都能够保证数据在编码转换中不出现丢失,也就是保证存储入数据库的是正确的内容。怎么保证取出的是正确的内容呢?考虑到绝大部分客户端 (包括 WP),发送数据的编码也就是它所希望收到数据的编码,所以:SET character_set_results='gb'可以保证取出给浏览器显示的格式就是 gb。如果是第二种情况,客户端以 utf-8 格式发送 (WP 的默认情况),可以采用下述配置:SET character_set_client='utf8'SET character_set_connection='utf8'SET character_set_results='utf8'这个配置就等价于 SET NAMES 'utf8'。WP 应该作什么修改还是那句话,客户端要发给数据库什么编码的数据,数据库是不可能确切知道的,只能让客户端自己说明白,所以,WP 是必须发送正确的 SET... 给 MySQL 的。怎么发送最合适呢?台湾的 pLog 同仁给出了一些建议:首先,测试服务器是否 >= 4.1,编译时是否加入了 UTF-8 支持;是则继续 然后测试数据库以什么格式存储 ($dbEncoding); SET NAMES $dbEncoding 对于第二点,WP 的情况是不同的,按照上面的典型配置,只要用 WP,肯定数据库是用 UTF-8 存储的,所以要根据用户设置的以 GB 还是 UTF-8 浏览来判断 (bloginfo('charset')),但这个值是要连接数据库以后才能得到的,所以效率最高的方式是连接数据库之后,根据这个配置设置一次 SET NAMES,而不必每次查询之前都设置一遍。我的修改方式是这样的,在 wp_includes/wp-db.php 中增加: function set_charset($charset){// check mysql version first.$serverVersion = mysql_get_server_info($this->dbh); $version = explode('.', $serverVersion); if ($version[0] < 4) return; // check if utf8 support was compiled in $result = mysql_query("SHOW CHARACTER SET like 'utf8'", $this->dbh); if (mysql_num_rows($result) < = 0) return;if ($charset == 'utf-8' || $charset == 'UTF-8')$charset = 'utf8';@mysql_query("SET NAMES '$charset'", $this->dbh); }在 wp-settings.php 的 require (ABSPATH . WPINC . '/vars.php'); 后增加: $wpdb->set_charset(get_bloginfo('charset'));

推荐整理分享MySQL中文乱码问题的解决第1/2页(mysql中文乱码解决),希望有所帮助,仅作参考,欢迎阅读内容。

MySQL中文乱码问题的解决第1/2页(mysql中文乱码解决)

文章相关热门搜索词:mysql中文乱码解决的命令,mysql中文乱码怎么解决,mysql中文乱码怎样用代码解决,mysql中文乱码解决,mysql中文乱码问题,mysql5.5中文乱码解决,mysql中文乱码怎样用代码解决,mysql中文乱码怎样用代码解决,内容如对您有帮助,希望把文章链接给更多的朋友!

如何把ACCESS的数据导入到Mysql中 如何把ACCESS的数据导入到Mysql中www.Alltips.Com--6极限技术网在建设网站的过程中,经常要处理一些数据的导入及导出.在Mysql数据库中,有两种方法来

MySQL两种表存储结构MyISAM和InnoDB的性能比较测试 MySQL支持的两种主要表存储格式MyISAM,InnoDB,上个月做个项目时,先使用了InnoDB,结果速度特别慢,1秒钟只能插入几条。后来换成MyISAM格式,一秒钟

GROUP_CONCAT的用法 GROUP_CONCAT今天工作需要,要用到groupby等等,查看手册,没想到发现了GROUP_CONCAT这个好东西,一下在省掉了我很多工作,这个函数在MySQL4.1中被加入。函

标签: mysql中文乱码解决

本文链接地址:https://www.jiuchutong.com/biancheng/319840.html 转载请保留说明!

上一篇:MySQL和SQLServer的比较(mysql和sqlserver的sql语句一样吗)

下一篇:如何把ACCESS的数据导入到Mysql中(如何把access数据库导入excel)

  • 单位承担的社保费用计入什么科目
  • 政府发放的人才补贴,企业可以增加条款要求离职返还吗
  • 开票信息中电话号码变更
  • 子公司对母公司的责任
  • 哪些会计科目需要结转
  • 企业破产时下列受偿等级最高的是
  • 发票不在业务发生地
  • 贸易公司的印花税税率是多少
  • 不含税销售收入含消费税吗
  • 工程围挡做法
  • 车间设备的维修费用什么科目
  • 五分钟了解外出经营活动税收管理证明
  • 分公司如何缴纳公积金
  • 技术服务发票税率 5% 小规模
  • 税盘被锁应该怎么办?
  • 2020金税四期上线
  • 企业在年度中间终止经营活动的,应当
  • 公司用窗帘用什么颜色
  • 开票含税和不含税怎么切换视频讲解
  • 供应商把价格算错了怎么办
  • 小规模企业申报表填写
  • 成本票要交税吗
  • 存货跌价准备借贷方表示的含义
  • 房屋租赁合同变更
  • 想用u盘装系统怎么弄
  • 怎么取消电脑开机自动启动软件
  • 注册资金印花税税目
  • 电脑legacy是什么意思
  • 长期待摊会计分录
  • Tip是什么意思英语
  • 重命名电脑名称有什么用
  • 固态硬盘什么牌子性价比高
  • wwwxxx域名选择(www.xxx.com或者.cn)
  • 定向增发后送股成本价
  • 违约金开什么票据
  • laravel技巧
  • 减征增值税会计处理
  • 客户要回扣
  • 结转销售成本的分录怎么写
  • 买花木计入什么科目
  • 农产品加计扣除1%怎么计算和会计分录
  • custom用法
  • 微信小程序人民法院审核通过多久立案
  • node.js快速入门
  • 运输发票是怎样计提的
  • 发票打印错误如何修改
  • 免税的10万元是什么
  • c语言中函数的数据类型是指
  • 生产成本制造费用借贷方向
  • 营业税金及附加是什么科目
  • 赠送给客户的商品是否要计入费用?
  • 公司名下汽车过户个人需要补税吗
  • 年底暂估成本有风险吗
  • 公司利润如何提取避税
  • 固定资产属于净资产指的是什么
  • 融资租赁租金会计科目
  • 工会活动购买的产品
  • 存货换入无形资产账务处理
  • 机关和事业单位党的支部委员会每届任期
  • 以他人名义投资该签订什么协议
  • 公司购入的房子卖了,如何交增值税
  • 应付账款余额为0怎么写
  • 提供加工劳务计入什么科目
  • 个税抵扣项目是什么
  • mysql 判断
  • Sqlserver聚集索引和非聚集索引的区别
  • centos6.5破解密码
  • 进程cmd.exe
  • jquerycuishifeng
  • nodejs的理解
  • python用while循环求π的值
  • 批处理图像
  • android 开发 教程
  • [Phonegap+Sencha Touch] 移动开发50 Android修改新建虚拟机存放的位置
  • 发票在税务系统查不到对方要怎么做
  • 个体户开票怎么开步骤
  • 企业所得税年报资产总额平均值怎么填写
  • 3.0排量 车船税
  • 税务局无编制人员工资
  • 湖北安徽是一个地方吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设