转两个关于mysql乱码的文章
时间:2007-03-15 来源:xh_terry
CODE |
从MySQL 4.1开始引入的多语言支持确实很棒,而且一些特性已经超过了其他的数据库系统。不过在测试过程中发现使用适用于MySQL 4.1之前的PHP语句操作MySQL数据库会造成乱码,即使是设置过了表字符集也是如此。 MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。 当我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。 其实简单的方法是通过phpMyAdmin来设置。 设置下面几项: 1: 语言设置为 chinese (zh- utf-8) 2: MySQL 字符集: UTF-8 Unicode (utf8) 3: MySQL 连接校对 : utf8_general_ci 4: 新增数据库和数据表的时候,整理项选择 utf8_general_ci 通过以上设置,在phpMyAdmin中操作和查询的时候,中文字符都不会乱码了。 但是你会发现,在php程序中用以前的sql语句查询出来的结果还是乱码,问题就出在connection连接层上。 解决方法是在成功连接数据库之后,发送一句查询语句: 1: $this->LinkID = @ mysql_connect($this->Host , $this->User, $this->Password); 2: @ mysql_query('SET NAMES 'utf8'' , $this->LinkID); -------------------------------------------- 来自:http://blog.liu21st.com/index.php?job=art&articleid=a_20050921_120809 |
=============================================
另一篇
=============================================
CODE |
mysql4.1是比较烦人,怎么弄都乱码,以下是部份网上流传之解决办法的资料: 1.修改/etc/my.cnf文件 找到 [mysqld]并在下面加一句: default-character-set=utf8 2. 重新启动mysql 打开phpmyadmin,选择lang为"Chines simplifies(zh-utf-8)",选择"MySQL 连接校对"为"utf8_general_ci "点"显示 MySQL 的运行信息"--"变量",可以看到: character set client utf8 utf8 character set connection utf8 utf8 character set database utf8 utf8 character set results utf8 utf8 character set server utf8 utf8 character set system utf8 utf8 collation connection utf8_general_ci utf8_general_ci collation database utf8_general_ci utf8_general_ci collation server utf8_general_ci utf8_general_ci 从这里可以看到character全部变成utf8了 ------------------------------------------------------------------------------------------------------------------ 将以前的mysql3的库文件导入mysql4.1的库,有两种情况: 一. 从phpmyadmin上导入时,要注意的是在选择库文件的页面左下脚有个"文件的字符集:",默认是utf8,改成gb2312,否则导进去乱码; 二. 在终端命令行方式导入,这时候你需要先在导入文件的头部加一行: SET NAMES 'gb2312'; 并注意最后也是;号,别漏了。 然后执行mysql -u用户名 -p密码 xxx.sql > 文件名 3. 从mysql4.1里导出库文件 一.用phpmyadmin导出, 导出倒是问题不大,如果phpmyadmin的浏览页面里显示的中文是正常的,那么导出肯定也是正常的。 二.从终端程序导出, 如果用mysqldump导出出现了乱码也没有关系,可以运行iconv来转换一下: iconv -c -f UTF-8 -t GB2312 库文件名 > 新的gb2312的库文件名 综上所述,你要注意: 1。尽量在需要导入的库文件的开头加入SET NAMES 'gb2312';告诉mysql你要导入的是一个gb2312的文件; 2。可能你需要这个: SET NAMES 'utf8'; 在登陆到mysql后用,把character的一些默认参数改到utf8上,有时可以减少一些困扰,不过也不是必须的。 在mysql上使用 SHOW VARIABLES LIKE 'character_set_%'; 用来查看当前的状态。 3.如果出现乱码也不要怕,其一是你要注意留存原有的备份,其二是用iconv来进行转化。 在正常使用之前注意做导入导出的测试,确保万无一失。 PHP连接和网页显示的乱码问题: 由于MySQL 4.1版本开始密码的hash算法改变,所以连接数据库时可能会出现Client does not support authentication protocol问题。 可以通过一下两种方法解决数据库用户密码不符问题: 其一: mysql> SET PASSWORD FOR 'some_user'@'some_host' = OLD_PASSWORD('newpwd'); 其二: mysql> UPDATE mysql.user SET Password = OLD_PASSWORD('newpwd') WHERE Host = 'some_host' AND User = 'some_user' PHP输出的乱码问题: 由于mysql的默认支持编码是latin字符集,所以中文字符在数据库里查看的时候看到的是乱码。但是如果将mysql编译为默认编码utf-8的话,又会造成原来的数据库不兼容,使得原来的内容在网站上显示为乱码。 Mysql 4.1.x出来以后,引入了collation (校勘)的概念,终于有办法让mysql同时支持多种编码的数据库了,所以PHP要用以下SQL语句来创建utf-8编码的数据库: CREATE DATABASE `mytest` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 但是仅仅是将数据库的校勘改为utf-8是不够的,还必须在连接了mysql数据库之后用这个语句来设置collation connection:SET NAMES 'utf8'; 如此,才能在php程序里得到正确编码的字符,并将其显示在web页面里。在drupal里是修改 include/database.mysql.inc 文件,在function db_connect($url)函数的 return $connection; 语句之前加入:mysql_query("SET NAMES 'utf8'",$connection); 也就是说只要在你连到数据库后,所有的查询语句都要类似于这句 mysql_query("Set Names 'uft8'"); 其中 uft8 可改成你需要的编码,e.g. gb2312 等。 总结:PHP和MYSQL互为搭档了很久了,并被大家认同为天生的一对。但我个人并不这么认为,使用PHP完全可以自由选择更快更适用的数据库。 |
相关阅读 更多 +