星期五, 七月 18, 2008

php5 读 MySQL5 utf8 中文乱码

这两天就弄MySql 了
开始 .net 乱码,现在 php5 也乱码,php5 下是这样解决的:

编码:
为了使php与mysql更好的支持中文,将采用UTF-8编码,相关配置如下。
1、mysql的配置,在安装好mysql后,配置时将字符编码改为UTF-8,即选中第二项。对具体的数据库中的每一个表的编码改为UTF-8
2、Apache中不需要更改,因为已包含
UTF-8编码
3、php中要对php.ini文件中line 637: extension=php_mbstring.dll 前的分号除掉,并且必需修改mb_string的相关编码配置,修改后的内容为:
line 1164: mbstring.language = utf-8
line 1169: mbstring.internal_encoding = utf-8
line 1172: mbstring.http_input = auto
line 1176: mbstring.http_output = utf-8
line 1183: mbstring.encoding_translation = On
line 1187: mbstring.detect_order = auto
line 1191: mbstring.substitute_character = utf-8;
line 1201: mbstring.func_overload = 1
(所有行号均对应的是php5.1.6 版本的php.ini-recommand)
4、在语句
$mysql_link = mysql_connect($mysql_host, $mysql_user, $mysql_pass);
后加上

mysql_query("SET NAMES 'UTF8'");
注意:UTF8不能写成UTF-8,否则不起作用


下面的是在百度上搜到的:

以前的国外主机用的Mysql是4.x系列的,感觉还比较好,都无论GBK和UTF-8都没有乱码,没想到新的主机的Mysql是5.0版本的,导入数据 后,用Php读出来全是问号,乱码一片,记得我以前也曾经有过一次切换出现乱码的经验,原因肯定是Mysql版本之间的差异问题。

只好查资料,发现了一个解决方法,就是在mysql_connect后面加一句SET NAMES UTF8,即可使得UTF8的数据库消除乱码,对于GBK的数据库则使用SET NAMES GBK,代码如下:

$mysql_mylink = mysql_connect($mysql_host, $mysql_user, $mysql_pass);
mysql_query("SET NAMES 'GBK'");


经过我的测试,我发现上面第二个方法就可以让 php5 读出的 MySQL5 的以utf8编码保存的中文字符。还有,以下这个是什么意思?:
$charset="latin1";
mysql_query("SET NAMES '".$GLOBALS['charset']."'");
就可以了
和
在写入数据库之前加上这段代码应该就能解决问题了,我前几天也碰到了这个问题,然后查遍论坛后,把所有文件保存成UTF8后,加上这段代码就完成,希望能解决你的问题
$sql = 'set names "utf8"';
if (!mysql_query($sql))
{
$this->error = 'cannot set character_sets';
$this->constructed = 0;
return false;
}


......

星期四, 七月 17, 2008

MySQL 的字符集

在my.cnf中加如下代码:
[client]
default-character-set=utf8
[mysqld]
default-character-set=utf8


如果不加以上代码,那么即便MYSQL编译安装时指定的编码是UTF8,那么在建库时其默认编码仍是LATIN1,而由于字符集的继承性,库中的表也是LATIN1的了。

这里列几条命令,大家可以自己试下:
1.列出MYSQL支持的所有字符集:
SHOW CHARACTER SET;

2.当前MYSQL服务器字符集设置
SHOW VARIABLES LIKE 'character_set_%';

3.当前MYSQL服务器字符集校验设置
SHOW VARIABLES LIKE 'collation_%';

4.显示某数据库字符集设置
show create database 数据库名;

5.显示某数据表字符集设置
show create table 表名;

6.修改数据库字符集
alter database 数据库名 default character set 'utf8';

7.修改数据表字符集
alter table 表名 default character set 'utf8';

8.建库时指定字符集
create database 数据库名 character set gbk collate gbk_chinese_ci;

9.建表时指定字符集
CREATE TABLE `mysqlcode` (
`id` TINYINT( 255 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`content` VARCHAR( 255 ) NOT NULL
) TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;
还有,改了数据库的编码,数据库要重建才有效,不仅仅是删除表,要连整个数据库都删除再重建原来的表才可以,反正我是这么解决的。

asp.net 调用 MySql 的参数

这个名起得有点不对题,我的意思是,在asp.net 写入 MySQL 的时候,用传入参数方式,开始怎么都不成功,在网上搜索了一圈以后才知道,原来MySQL 的参数名要用 ? 开头的。放在这的这篇文字就是想记住这点东西,因为以前出现过找到的东西找不到了。

一个例子:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim oconn As New MySqlConnection("Data Source=192.168.1.253; Database=db1; user=walker; password=mima;")
oconn.Open()
Dim strQuery As String = "insert into t1 (uname, ucont) values (?un, ?uc)"
Dim oCmd As New MySqlCommand(strQuery, oconn)

Dim pun As MySqlParameter = New MySqlParameter("?un", MySqlDbType.VarChar, 20)
Dim puc As MySqlParameter = New MySqlParameter("?uc", MySqlDbType.VarChar, 255)
pun.Value = TextBox1.Text
puc.Value = TextBox2.Text
Dim paras As MySqlParameter() = {pun, puc}
Dim p As MySqlParameter
For Each p In paras
oCmd.Parameters.Add(p)
Next
'oCmd.Parameters.Add(New MySqlParameter("@un", MySqlDbType.VarChar, 20))
'oCmd.Parameters.Add("?uc", MySqlDbType.VarChar, 255).Value = TextBox2.Text
'oCmd.Parameters("@un").Value = TextBox1.Text
'oCmd.Parameters("@uc").Value = TextBox2.Text
oCmd.Connection = oconn
'strQuery = "insert into t1 (uname, ucont) values ('" & TextBox1.Text & "','" & TextBox2.Text & "')"
oCmd.CommandText = strQuery
oCmd.CommandType = CommandType.Text
'lblMsg.Text = oCmd.Parameters("@un").Value.ToString
Dim iVal As Integer = 0
iVal = oCmd.ExecuteNonQuery
lblMsg.Text &= "结果:" & iVal.ToString & " ."
oCmd.Parameters.Clear()
oconn.Close()
' _gb()

End Sub
有点乱哈 ....

MySQL 权限的定义

格式:
GRANT 权限 on 数据库.表名 to 用户名@登录主机 identified by "密码";
Grant [gra:nt] n. 拨款 vt. 授予,同意,承认

实例如下:
创建一个名为 ahwei 的用户,密码 1234 拥有 localhost 的 phpbook 的所有权限:

mysql> GRANT ALL PRIVILEGES ON phpbook.* TO ahwei@localhost IDENTIFIED BY '1234';


创建一个新用户名为:walker:

mysql> GRANT select, update, insert, delete ON *.* TO walker@192.168.11.1 identified BY "mima";


看结果:

mysql> use mysql;
mysql> select host, user, password from user;

mysql>

就看到了。

主机名:

将主机名字段值改为 "%" 就表示在任何客户端机器上都可以用 walker 名登录,可以在开发时设为 "%" 。

UPDATE user SET host = '%' WHERE user = 'walker' ;

An angel 天使

I wish I had your pair of wings      我希望拥有你的一双翅膀
Had them last night in my dreams     昨夜在梦中实现
I was chasing butterflies         我追逐着蝴蝶
Till the sunrise broke my eyes      直到黎明的光芒照亮我的眼睛

Tonight the sky has glued my eyes    今晚的天空吸引了我的双眼
Cause what they see's an angel hive    因为它们看到了一片天使的领域
I've got to touch that magic star     我触摸到了那颗神奇的星
And greet the angels in their hive    (我飞到那片)天使的领域里向她们问候

Sometimes I wish I were an angel    有时我希望我是个天使
Sometimes I wish I were you      有时我希望自己就是你
Sometimes I wish I were an angel    有时我希望我是个天使
Sometimes I wish I were you一个    像你一样的天使

And all the sweet honey from above   所有上天赐予的甜蜜
Pour it all over me sweet love      倾注给我最美妙的爱
And while you're flying around my head  当你在我的脑海中萦绕
Your honey kisses keep me fed     你甜蜜的吻让我感到满足

I wish I had your pair of wings     我希望拥有你的一双翅膀
Just like last night in my dreams    就像昨夜梦中一样
I was lost in paradise         我迷失在天堂
Wish I'd never opened my eyes    希望再也不要醒来

Sometimes I wish I were an angel   有时我希望我是天使
Sometimes I wish I were you     有时我希望自己就是你
Sometimes I Wish I were an angel   有时我希望自己是个天使
Sometimes I wish I were you     一个像你一样的天使

But there's danger in the air      但是天空中又隐藏着危险
Tryin' so hard to be unfair       它正竭力变得不公正
Danger's in the air           那天空中的危险啊
Tryin' so hard to give us a scare     正试图带给我们惊恐
But were not afraid         但我们却决不胆怯

Sometimes I wish I were an angel   有时我希望我是天使
Sometimes I wish I were you     有时我希望自己就是你
Sometimes I wish I were an angel   有时我希望我是个天使
Sometimes I wish I were you     像你一样的天使

Wish I were you           就像你那样
Oh I wish I were you         像你一样的天使