mysql数据库乱码问题总结_第1页
mysql数据库乱码问题总结_第2页
mysql数据库乱码问题总结_第3页
mysql数据库乱码问题总结_第4页
mysql数据库乱码问题总结_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MysqlMysql 数据库乱码总结数据库乱码总结 今天又独到了 Mysql 乱码问题 过去总是匆匆的解决了就算了 这次我实在受不了了 每次都 是迷迷糊糊的改好的 这次决定好好探索一把 看了很多资料及博客之后才理解了点 先记录下来 如有不对的请指正 1 首先 Mysql 是在 4 0 之后才支持多字符集的 所以只有 4 0 之后才会出现这种问题 编码 转换的规则就是 在输入数据时将编码由 客户端编码 转换为 服务器端编码 输出时将数据由 服务器端编码 转换为 客户端编码 MySQL 的字符集处理是这样的 1 发送请求 1 客户端发送请求到服务器端 2 服务器端会把请求的数据从客户端字符集 character set client 转 成服务器连接字符集 character set connection 3 然后服务器会检测存储区域 table column 的字符集 然后把数据从连接字符集 character set connection 转为存储区域 table column 的字符集 然後再存储或者查询 2 返回请求 1 服务器将存储区域 table column 的字符集转换成服务器连接字符集 character set connection 2 将服务器连接字符集 character set connection 转换成结果字符集 character set results 再发送到客户端 首先我们看下 mysql status 我们可以看到四个字符集的设置 1 改变 my ini 文件中的编码可以改变所有的字符集 2 set names uf8 可以改变 Client conn 这两个字符集 3 建立数据库时的设置编码可以改变 DB 这个 知道了 原理之后我开始解决今天遇到的问题 1 在其他地方正常显示中文 但是在 CMD 中不能显示显示乱码 首先我设置了 my ini 将字符集全部设置为 utf8 个人感觉 utf8 是趋向标准的 然后数据库建立时设置为 utf8 可是看到 CMD 查询出的是乱码 这是因为 CMD 也就是我们熟知的 windows 下的 dos 是不支持 utf8 的 所以我设置输出到客户端编码方式转换成 GBK 即可 也就是 set names gbk ok 问题解决 作者 JavaNote MySQL 插入数据时 中文乱码问题的解决 当向 MySQL 数据库插入一条带有中文的数据形如 insert into employee values null 张三 female 1995 10 08 2015 11 12 Sales 2000 是个好员工 出现乱码时 可以使用语句 show variables like character 来查看当前数据库的相关编码集 从上图中可以看到 MySQL 有六处使用了字符集 分别为 client connection database results server system 其中与服务器端相关 database server system 永远无法修改 就是 utf 8 与客户端相关 connection client results client为客户端使用的字符集 connection 为连接数据库的字符集设置类型 如果程序没有指明连接数据库使用的字符集类型则按照服务器端默认的字符集设置 database为数据库服务器中某个库使用的字符集设定 如果建库时没有指明 将使用服务器安装时指定的字符集设置 results为数据库给客户端返回时使用的字符集设定 如果没有指明 使用服务器默认的字符集 server为服务器安装时指定的默认字符集设定 system为数据库系统使用的字符集设定 了解了上面的信息我们来分析下乱码的原因 问题出在了当前的 CMD 客户端窗口 因为当前 的 CMD 客户端输入采用 GBK 编码 而数据库的编码格式为 UTF 8 编码不一致导致了乱 码产生 而当前 CMD 客户端的编码格式无法修改 所以只能修改 connection client results 的编码集来告知服务器端当前插入的数据采用 GBK 编码 而服务器的数据库 虽然是采用 UTF 8 编码 但却可以识别通知服务器端的 GBK 编码数据并将其自动转换为 UTF 8 进行存储 可以使用如下语句来快速设置与客户端相关的编码集 set names gbk 设置完成后即可解决客户端插入数据或显示数据的乱码问题了 但我们马上会发现这种形式的 设置只会在当前窗口有效 当窗口关闭后重新打开 CMD 客户端的时候又会出现乱码问题 那 么 如何进行一个一劳永逸的设置呢 在 MySQL 的安装目录下有一个 my ini 配置文件 通 过修改这个配置文件可以一劳永逸的解决乱码问题 在这个配置文件中 mysql 与客户端配置 相关 mysqld 与服务器配置相关 默认配置如下 mysql default character set utf8 mysqld character set server utf8 这时只需要将下的默认编码 default character set utf8 改为 default character set gbk 重新 启动 MySQL 服务即可 Set names x 相关问题 SET NAMES x 语句与这三个语句等价 mysql SET character set client x mysql SET character set results x mysql SET character set connection x 是用来设置客户端的字符集的 与服务器端的字符集无关 应该说 msyql 服务 器端存储的字符是一定的 MYSQL 字符集问题 MySQL 的字符集支持 Character Set Support 有两个方面 字符集 Character set 和排序方式 Collation 对于字符集的支持细化到四个层次 服务器 server 数据库 database 数据表 table 和连接 connection 1 MySQL 默认字符集 MySQL 对于字符集的指定可以细化到一个数据库 一张 表 一列 应该用什么字符 集 但是 传统的 程序在创建数据库和数据表时并没有使用那么复杂的配置 它们 用的是默认的配置 那么 默认的配置从何而来呢 1 编译 MySQL 时 指定了一个默认的字符集 这个字符集是 latin1 2 安装 MySQL 时 可以在配置文件 my ini 中指定一个默认的的字符 集 如果没指定 这个值继 承自编译时指定的 3 启动 mysqld 时 可以在命令行参数中指定一个默认的的字符集 如果 没指定 这个值继承自配置 文件中的配置 此时 character set server 被设定为这个默认的字符集 4 当创建一个新的数据库时 除非明确指定 这个数据库的字符集被缺省 设定为 character set server 5 当选定了一个数据库时 character set database 被设定为这个数据 库默认的字符集 6 在这个数据库里创建一张表时 表默认的字符集被设定为 character set database 也就是这个 数据库默认的字符集 7 当在表内设置一栏时 除非明确指定 否则此栏缺省的字符集就是表默 认的字符集 简单的总结一下 如果什么地方都不修改 那么所有的数据库的所有表的所有 栏位的都用 latin1 存储 不过我们如果安装 MySQL 一般都会选择多语言支持 也就是说 安装程序会 自动在配置文件中把 default character set 设置为 UTF 8 这保证了缺省情况下 所有的数据库 的所有表的所有栏位的都用 UTF 8 存储 2 查看默认字符集 默认情况下 mysql 的字符集是 latin1 ISO 8859 1 通常 查看系统的字符集和排序方式的设定可以通过下面的两条命令 mysql SHOW VARIABLES LIKE character Variable name Value character set client latin1 character set connection latin1 character set database latin1 character set filesystem binary character set results latin1 character set server latin1 character set system utf8 character sets dir D mysql 5 0 37 share charsets mysql SHOW VARIABLES LIKE collation Variable name Value collation connection utf8 general ci collation database utf8 general ci collation server utf8 general ci 3 修改默认字符集 1 最简单的修改方法 就是修改 mysql 的 my ini 文件中的字符集键值 如 default character set utf8 character set server utf8 修改完后 重启 mysql 的服务 service mysql restart 使用 mysql SHOW VARIABLES LIKE character 查看 发现数据库编码 均已改成 utf8 Variable name Value character set client utf8 character set connection utf8 character set database utf8 character set filesystem binary character set results utf8 character set server utf8 character set system utf8 character sets dir D mysql 5 0 37 share charsets 2 还有一种修改字符集的方法 就是使用 mysql 的命令 mysql SET character set client utf8 mysql SET character set connection utf8 mysql SET character set database utf8 mysql SET character set results utf8 mysql SET character set server utf8 mysql SET collation connection utf8 mysql SET collation database utf8 mysql SET collation server utf8 一般就算设置了表的默认字符集为 utf8 并且通过 UTF 8 编码发送查询 你会发 现存入数据库的仍然是乱码 问题就出在这个 connection 连接层上 解决方法是在发送查询前执行一下下 面这句 SET NAMES utf8 它相当于下面的三句指令 SET character set client utf8 SET character set results utf8 SET character set connection utf8 总结 因此 使用什么数据库版本 不管是 3 x 还是 4 0 x 还是 4 1 x 其实对我们 来说不重要 重要的有二 1 正确的设定数据库编码 MySQL4 0 以下版本的字符集总是默认 ISO8859 1 MySQL4 1 在安装的时候会 让你选择 如果你准备使用 UTF 8 那么在创建数据库的时候就要指定好 UTF 8 创建好以后也可以改 4 1 以上版本还可以单独指定表的字符集 2 正确的设定数据库 connection 编码 设置好数据库的编码后 在连接数据库 时候 应该指定 mysql5 提供了以下几个设置字符集的系统变量 character set client 客户端字符集 character set connection 客户端与服务器端连接采用的字符集 character set results SELECT 查询返回数据的字符集 character set database 数据库采用的字符集 乱码问题一般是由于以上几个变量设置错误照成的 所以只要理解这几个变量 就可以与告别乱码了 使用上述变量 要理解这个核心思想 character set client character set connection 这两个变量保证要与 character set database 编码的一致 而 character set results 则保证与 SELECT 返回的结果与程序的编码一致 我们可以在程序中使用 set names 来同时设置 character set client character set connection character set results 这三个系统变量 例如 set names utf8 等同于 set character set client utf8 set character set connection utf8 set character set results utf8 一般情况下 当数据库与数据库表的字符集为 utf8 我们再在程序里设置 set names utf8 命令 这样就能保证无乱码了 但是 这里还要注意 character set results 变量的值 character set results 的字符值是用来显 示返回给用户的编码的 例如 你的数据库 character set database 用的是 utf8 的字符集 那么你就 要保证 character set client character set connection 也是 utf8 的字符 集 而你的程序也许采用的并不是 utf8 比如你的程序用的是 gbk 那么你若 把 character set results 也设置为 utf8 的话就会出现乱码问题 此时你应该 把 character set results 设置为 gbk 这样就能保证数据库返回的结果与你 的程序的编码一致 以下摘自网络的一程序段 fetch one SELECT VERSION if substr version 0 1 4 取出当前数据库的字符集 sql SELECT character set database char current db fetch one sql 将客户端字符集 character set client 和连接字符集 character

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论