Mysql数据库的字符编码转换还真是相当的麻烦
当初不小心用了GBK现在要回到utf-8,而数据已经非常大了

网上找了无数资料,一般都是利用mysqldump加iconv再导回去,但做了之后发现会有错误。还有比较夸张的方法是用编辑器来转换编码,这对于海量数据根本行不通。

最后还是利用了Navicat来解决。
我使用的方法比较保险,用了远程和本地两个数据库。
远程的是gbk编码,想转成utf-8的。
直接在Navicat中建立两条连接,一条是连接远程的,将连接字符编码设置为gbk。
本地设置为utf-8或者数据库默认是utf-8就选择默认的连接字符编码。

选择使用DATA TRANSFER并按步骤将远程数据库中的数据传到本地上。
完成后可以检查本地的数据,应该就是utf-8格式了,修改连接字符编码再将本地的数据导到远程的。
这样就实现了数据库字符编码的转换工作,而且相当的安全。

MySQL数据库字符编码集合 不指定

jed , 2008-5-15 07:26 , 数据库技术 , 评论(0) , 阅读(2779) , Via 本站原创
MySQL数据库字符集的默认配置:

       在mysql的配置文件中把默认的字符集改成utf8,这样创建数据库和表的时候,默认的字符集就是utf8。

MySQL的几个变量:

当一个 PHP 程序与 MySQL 建立连接后,这个程序发送给 MySQL 的数据采用的是什么字符集?mysql如何检测并判断使用何种字符集?要注意以下几个变量:

      character_set_server:这是设置服务器使用的字符集
     character_set_database:这是设置数据库使用的字符集
      character_set_client :这是设置客户端发送Query串使用的字符集
      character_set_connection :这是设置服务器需要将收到的查询串转换成的字符集
      character_set_results :这是设置服务器要将结果数据转换到的字符集,转换后才发送给客户端

因为配置文件设置的 default_character_set 是 utf8,数据表默认采用的就是 utf-8 建立的。这也应该是所有采用 MySQL 4.1 的主机提供商应该采用的配置。所以我们要保证的只是客户端与 MySQL 交互之间指定编码的正确。
这只有两种可能,客户端以 gb2312 格式发送数据,或者以 utf-8 格式发送数据。
如果以 gb2312 格式发送:
SET character_set_client='gb2312'
SET character_set_connection='utf8' 或者
SET character_set_connection='gb2312'
都是可以的,都能够保证数据在编码转换中不出现丢失,也就是保证存储入数据库的是正确的内容。
怎么保证取出的是正确的内容呢?考虑到绝大部分客户端 (包括 WP),发送数据的编码也就是它所希望收到数据的编码,所以:
SET character_set_results='gb2312'
可以保证取出给浏览器显示的格式就是 gb2312。不过这样的缺点是不论是插入、更新、删除还是查询操作,只要是操纵数据库,都要先执行SET NAMES "gb2312",这样才能保证插入和显示的正确性。如果插入操作前没有执行这条语句,仅在查询时执行该语句,则仍然无法保证显示的正确性。
如果是第二种情况,客户端以 utf-8 格式发送 (WP 的默认情况),可以采用下述配置:
SET character_set_client='utf8'
SET character_set_connection='utf8'
SET character_set_results='utf8'
这个配置就等价于 SET NAMES ‘utf8′。
一直对utf8_unicode_ci与utf8_general_ci这2个校对集很迷惑,今天查了手册有了点眉目。不过对中文字符集来说采用utf8_unicode_ci与utf8_general_ci时有何区别还是不清楚?
下面摘录一下Mysql 5.1中文手册中关于utf8_unicode_ci与utf8_general_ci的说明:

    当前,utf8_unicode_ci校对规则仅部分支持Unicode校对规则算法。一些字符还是不能支持。并且,不能完全支持组合的记号。这主要影响越南和俄罗斯的一些少数民族语言,如:Udmurt 、Tatar、Bashkir和Mari。

    utf8_unicode_ci的最主要的特色是支持扩展,即当把一个字母看作与其它字母组合相等时。例如,在德语和一些其它语言中‘ß’等于‘ss’。

    utf8_general_ci是一个遗留的 校对规则,不支持扩展。它仅能够在字符之间进行逐个比较。这意味着utf8_general_ci校对规则进行的比较速度很快,但是与使用utf8_unicode_ci的 校对规则相比,比较正确性较差)。

    例如,使用utf8_general_ci和utf8_unicode_ci两种 校对规则下面的比较相等:
    Ä = A
    Ö = O
    Ü = U

    两种校对规则之间的区别是,对于utf8_general_ci下面的等式成立:
    ß = s

    但是,对于utf8_unicode_ci下面等式成立:
    ß = ss

    对于一种语言仅当使用utf8_unicode_ci排序做的不好时,才执行与具体语言相关的utf8字符集 校对规则。例如,对于德语和法语,utf8_unicode_ci工作的很好,因此不再需要为这两种语言创建特殊的utf8校对规则。

    utf8_general_ci也适用与德语和法语,除了‘ß’等于‘s’,而不是‘ss’之外。如果你的应用能够接受这些,那么应该使用utf8_general_ci,因为它速度快。否则,使用utf8_unicode_ci,因为它比较准确。

Tags: , , ,
建表时先加上default charset=utf8;

插入中文数据之前(Mysql命令提示符下)是用set names gb2312;

在php页面中设置是mysql_query('SET NAMES UTF8');

在php页面(已设定为utf8后)中插入中文数据不会出现乱码,应该插入数据库的时候就是以utf8字符集插入中文数据的故不会出现问题!

在php页面前面不要忘了加上header('content-type;text/html;charset=utf-8');

大家在MySQL命令提示符下想查看数据,中文数据有可能是如下 '?????'

所以大家想查看到正确的中文要与插入中文数据一样使用set names gb2312;
PHP+MySql获取新添加记录的ID值

1.假设字段名称为recordID

2.字段属性须设为:auto_increment

3.添加数据后使用

$newID = mysql_insert_id();

得到ID值


ASP获取即时ID值

ASP+Access2000

1.要获取的ID值字段属性必须设为:自动编号(我们假设字段名为recordID)

2.添加记录格式:Rs.Open table,Cn,1,3
注意模式为:1,3

3.newID = rs.Fields("recordID")

4.newID为刚添加的记录的ID值

ASP+SQL Server 2000

1.要获取的ID值字段属性必须设为:自动编号(我们假设字段名为recordID)

2.添加记录代码模式:

Cn.Execute"INSERT INTO table(field1,field2,...) VALUES("field1Value","field2Value",...)"

3.得到ID值

Set Rss = Cn.Execute("SELECT SCOPE_IDENTITY() as newIDValue FROM table")
'Rs.Open sqlStr,Cn,3,1
newID = Rss("newIDValue")

4.newID为刚添加的记录的ID值

5.附上取得ID值的三种方式:

/* 对于想要得到一个表中的最后一个插入操作所产生的ID的最好用IDENT_CURRENT('TBName')*/
INSERT INTO table(field1,field2,...) VALUES("field1Value","field2Value",...) SELECT IDENT_CURRENT('recordID') as newIDValue

/*对于马上使用的刚才插入的新记录ID用SCOPE_IDENTITY()是最合适的*/
INSERT INTO table(field1,field2,...) VALUES("field1Value","field2Value",...) SELECT SCOPE_IDENTITY() as newIDValue

/*对于想要得到一系列的操作中最后得到的那个自增的ID最好用@@IDENTITY*/
INSERT INTO table(field1,field2,...) VALUES("field1Value","field2Value",...) SELECT @@IDENTITY as newIDValue

以上三种方式在SQL Server2000的查询分析器里测试成功,如果要用到网页代码里,请根据上面的例子修改(本人都已测试成功了)
Tags: ,
mysql_fetch_object,mysql_fetch_array,mysql_fetch_row有什么区别?同样是取数据,它们的区别在那里呢?

object mysql_fetch_object ( resource result )

返回根据所取得的行生成的对象,如果没有更多行则返回 FALSE。

这个返回的是一个对象

示例

<?php
mysql_connect("hostname", "user", "password");
mysql_select_db("mydb");
$result = mysql_query("select `user_id`,`fullname` from mytable");
while ($row = mysql_fetch_object($result)) {
   echo $row->user_id;
   echo $row->fullname;
}
mysql_free_result($result);
?>

mysql_fetch_row -- 从结果集中取得一行作为枚举数组
这个返回的是一个数字索引的数组 例子

<?php
mysql_connect("hostname", "user", "password");
mysql_select_db("mydb");
$result = mysql_query("select `user_id`,`fullname` from mytable");
while ($row = mysql_fetch_row($result)) {
   echo $row[0];
   echo $row[1];
}
mysql_free_result($result);
?>


mysql_fetch_array --  从结果集中取得一行作为关联数组,或数字数组,或二者兼有
array mysql_fetch_array ( resource result [, int result_type] )
mysql_fetch_array() 中可选的第二个参数 result_type 是一个常量,可以接受以下值:MYSQL_ASSOC,MYSQL_NUM 和 MYSQL_BOTH。本特性是 PHP 3.0.7 起新加的。本参数的默认值是 MYSQL_BOTH。

返回根据从结果集取得的行生成的数组,如果没有更多行则返回 FALSE。


<?php
mysql_connect("hostname", "user", "password");
mysql_select_db("mydb");
$result = mysql_query("select `user_id`,`fullname` from mytable");
while ($row = mysql_fetch_array($result,MYSQL_BOTH)) {
   echo $row[0];
   echo $row['user_id'];
   echo $row[1];
   echo $row['fullname'];
}
mysql_free_result($result);
?>
Tags:
注册总是失败,sql语句也运行了,可就是不能向数据库中插入数据。后来发现,原来在程序中链接了多个数据库,在sql语句后面习惯性的没有加指定的数据库链接,所以造成了,数据库中无法插入数据。

数据库链接代码(链接多个数据库)
Tags:


$conn1 = mysql_connect("xxxxx", "xxx", "xx");
mysql_select_db("xxxxx", $conn1);
$conn2 = mysql_connect("yyyyy", "yyy", "yy");
mysql_select_db("yyyy", $conn2);

$sql = "select ....";
$result = mysql_query($sql, $conn1);
$sql = "up...";
mysql_query($sql, $conn2);

SQL的replace替换 晴

jed , 2007-4-10 09:47 , 数据库技术 , 评论(0) , 阅读(11330) , Via 本站原创
update 表名 set 字段名 =REPLACE(字段名 ,'替换前内容','替换后内容');

操作前,慎重,做好备份
终于让服务器每天早上备份一次 MySQL 数据库并自动打包,同时删除 5 天前的备份文件. 分享如下.

1. 环境: windows server 2003 + Apache 2.0 + PHP5 + MySQL 4.0.26 .

2. 假设 PHP 安装目录为 D:/php ,MySQL 安装目录为 D:/mysql.

3. 在 D:/php 下建立目录 WinRAR, 把你 winrar 安装目录下的 WinRAR.exe 和 RARReg.KEY 复制到 D:/php/WinRAR .

4. D:/php 下建立文件 mysql_backup.php:
分页: 4/6 第一页 上页 1 2 3 4 5 6 下页 最后页 [ 显示模式: 摘要 | 列表 ]