4 楼

yyyyy5101

2009-11-12

$conn=mysql_connect("localhost","root","123456");

mysql_select_db("db_bcty365",$conn);

mysql_query("set names gb2312");

?>

其中:

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。这样就能保证数据库返回的结果与你的程序的编码一致。以下摘自网络的一程序段:

//假设我们的程序采用的是utf8的字符集

$program_char = 'utf8';

//先检查mysql的版本号,如果版本号大于4我们才可以设置这些系统变量(mysql4还没有这些系统变量)

$version = current($db->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_set_connection)设置为与数据库字符集(character_set_database)一致

$db->query('SET @@character_set_client = "' . $char . '"');

$db->query('SET @@character_set_connection = "' . $char . '"');

//将SELECT查询返回数据的字符集设置为与当前程序的字符集一致

$db->query('SET @@character_set_results = "' . $program_char . '"');

}

?>

1、要保证数据库中存的数据与数据库编码一致,即数据编码与character_set_database一致;

2、要保证通讯的字符集与数据库的字符集一致,即character_set_client, character_set_connection与character_set_database一致;

3、要保证SELECT的返回与程序的编码一致,即character_set_results与程序编码一致;

4、要保证程序编码与浏览器编码一致,即程序编码与一致。

mysql substr 中文乱码_刚碰到的MySql乱码的问题相关推荐

  1. mysql substr 中文字符_解析使用substr截取UTF-8中文字符串出现乱码的问题

    我们知道有时候使用substr来截取UTF-8中文字符串的时候,经常会出现乱码,为什么会出现这样的问题呢,本文告诉你答案. 看这样一段代码吧(字符编码为UTF-8): $str = '都知道strle ...

  2. 易语言mysql乱码_分享一个解决MySQL写入中文乱码的方法

    [编程语言:易语言] 之前有发帖请教过如何解决MySQL写入中文乱码的问题.但没人会,或者是会的人不想回答.搜索网上的答案并尝试很多次无效,所以当时就因为这个乱码问题搁浅了一个软件很多日子. 直到昨天 ...

  3. c# mysql 汉字乱码_在C#和MySQL中存取中文字符时避免乱码的方法

    当用到socket来进行网络程序开发时,大多数情况下会遇到中文字符的发送与接收,这时若对发送的字符串用默认的方式进行处理,则一般会得到一堆乱码. 由于中文字符采用双字节表示,所以对含有中文的字符串的处 ...

  4. hibernate mysql 中文乱码_使用Hibernate和mysql中文乱码问题

    今天遇到mysql和Hibernate的乱码问题,花了好一会.最后,终于解决了. 现在从头整理一下解决乱码问题思路. 乱码问题说到底是字符集不同造成的.如果从头到尾,都是使用的同一个支持该种字符的字符 ...

  5. python django mysql写入中文乱码_解决django 向mysql中写入中文字符出错的问题

    之前使用django+mysql建立的一个站点,发现向数据库中写入中文字符时总会报错,尝试了修改settings文件和更改数据表的字符集后仍不起作用.最后发现,在更改mysql的字符集后,需要重建数据 ...

  6. 怎么解决mysql中文显示_怎样解决关于MySQL显示中文的问题?

    第一种方法,很精辟的总结: 经常更换虚拟主机,而各个服务商的MYSQL版本不同,当导入数据后,总会出现乱码等无法正常显示的问题,查了好多资料,总结出自己的一点技巧: WINDOWS 下导入应该这样 使 ...

  7. php mysql 读取中文数据的函数_php读取mysql中文数据出现乱码的解决方法

    以下是对php读取mysql中文数据出现乱码问题的解决方法进行了介绍,需要的朋友可以过来参考下 1.PHP页面语言本身的编码类型不合适,这时候,你直接在脚本中写的中文肯定是乱码,不用说数据库了 解决方 ...

  8. php mysql存储中文为空_PHP如何解决MySQL存储数据中文乱码

    PHP如何解决MySQL存储数据中文乱码?本文主要介绍了PHP+MySQL存储数据常见中文乱码问题,针对php+mysql常见的中文乱码问题予以总结分析,并给出了解决方法供大家参考.需要的朋友可以参考 ...

  9. mysql 数据库字符集转换_字符集介绍及mysql数据库编码转换

    一.字符集介绍: 1.ASCII ASCII是英文American Standard Code for Information Interchange的缩写,美国标准信息交换代码是由美国国家标准学会( ...

最新文章

  1. cuda安装教cudnn安装显卡问题
  2. 寻找数组变化:树形结构,分治模型
  3. 反射、对象拷贝、异常常见问题总结
  4. Serverless——前端的3.0时代
  5. 使用 Async 和 Await 的异步编程
  6. presentViewController和pushViewController
  7. BeetleX之Websocket协议分析详解
  8. Codeforces Round #379 (Div. 2) A. Anton and Danik 水题
  9. 关于FND_PROFILE与FND_GLOBLE[Z]
  10. 数字图像处理第三版中文版部分答案-冈萨雷斯
  11. web前端总结之文本超出显示省略号
  12. 解决DELL WIN7 bootmgr is missing
  13. android进程通信6,[Android]你不知道的Android进程化(6)--进程通信Andromeda框架
  14. 全志平台boot框架中增加设备驱动过程分析
  15. 每周分享第 10 期
  16. vue实现音乐平台项目
  17. Multipathd Daemon was Unable to Set Options fast_io_fail_tmo or dev_loss_tmo Under UEK1 or RHCK
  18. 在 Ubuntu 18.04 下安装 Klee 2.2
  19. learn more ,study less(一):整体性学习策略
  20. 简单明了的正则表达式汇总

热门文章

  1. 客快物流大数据项目(十四):DockerFile介绍与构建过程解析
  2. [C] [字节跳动] [编程题] 手串
  3. RecyclerView 删除Item 以及删除整个RecyclerView
  4. Flutter 网络请求库http
  5. Linux 忘记登录密码?破解系统登陆密码
  6. Js时间格式[转载]
  7. 2022-2028年中国服装电商行业发展战略规划及投资方向研究报告
  8. Eclipse中10个最有用的快捷键组合
  9. 基础知识:页面div始终浮在浏览器顶部
  10. 2017-04-09,周日整理