仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 774|回复: 8
打印 上一主题 下一主题

[学习教程] 发布Mysql 数据库字符集转换及版本晋级/升级的具体教程

[复制链接]
莫相离 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 20:13:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
“对于MySQL数据库,无论是在开发方面,还是支持方面,现在有大量强大的MySQL学习教程可以选择。每一个新手开发者可以轻松地使用MySQL数据库进行开发。MySQL数据库字符集转换及版本晋级/升级的具体教程

本文为穆亦风原创,原帖地点http://club.muzone.cn/viewthread.php?tid=28605
转贴请说明出处,十分感激!
比来discuz公布了新的版本,收费了,用的人更多了,之前利用别的论坛程序和discuz2.5/3.0的纷繁转换或晋级到discuz4.0,可见discuz作为中国人开辟的php论坛程序,的确长短常优异的,在人人欣喜若狂的时分,也碰到了一些成绩
看到很多用户反应转换完今后是乱码的情形,呈现这类征象的次要缘故原由是这类用户利用的都是mysql4.1以上的版本.上面作一个申明,但愿呈现这个成绩的伴侣都本事心的把这个文档看完!!!
MySQL4.1入手下手,对多言语的撑持有了很年夜变更(这招致了成绩的呈现)。只管年夜部分的中央(包含团体利用和主机供应商),MySQL3、4.0仍旧占主导位置;但MySQL4.1以致5.0是MySQL官方保举的数据库,已有主机供应商入手下手供应并将会愈来愈多;由于latin1在很多中央(下边会具体形貌详细是哪些中央)作为默许的字符集,乐成的蒙蔽了很多PHP程序的开辟者和用户,掩饰了在中文等言语情况下会呈现的成绩。
MySQL4.1入手下手把多国言语字符集分的加倍具体,以是招致数据库迁徙,或则dz论坛晋级到4.0后(dz4.0入手下手利用gbk或utf-8编码)呈现乱码成绩。
MySQL4.1的字符集撑持(CharacterSetSupport)有两个方面:字符集(Characterset)和排序体例(Collation)。关于字符集的撑持细化到四个条理:服务器(server),数据库(database),数据表(table)和毗连(connection)。
检察体系的字符集和排序体例的设定能够经由过程上面的两条命令:

QUOTE:
mysql>SHOWVARIABLESLIKEcharacter_set_%;
+--------------------------+----------------------------+
|Variable_name|Value|
+--------------------------+----------------------------+
|character_set_client|latin1|
|character_set_connection|latin1|
|character_set_database|latin1|
|character_set_results|latin1|
|character_set_server|latin1|
|character_set_system|utf8|
|character_sets_dir|/usr/share/mysql/charsets/|
+--------------------------+----------------------------+
7rowsinset(0.00sec)
mysql>SHOWVARIABLESLIKEcollation_%;
+----------------------+-------------------+
|Variable_name|Value|
+----------------------+-------------------+
|collation_connection|latin1_swedish_ci|
|collation_database|latin1_swedish_ci|
|collation_server|latin1_swedish_ci|
+----------------------+-------------------+
3rowsinset(0.00sec)
MySQL4.1关于字符集的指定能够细化到一台呆板上安装的MySQL,个中的一个数据库,个中的一张表,个中的一栏,应当用甚么字符集。可是,传统的Web程序在创立数据库和数据表时并没有利用那末庞大的设置,它们用的是默许的设置,那末,默许的设置从何而来呢?
编译MySQL时,指定了一个默许的字符集,这个字符集是latin1;
安装MySQL时,能够在设置文件(my.ini)中指定一个默许的的字符集,假如没指定,这个值承继自编译时指定的;
启动mysqld时,能够在命令行参数中指定一个默许的的字符集,假如没指定,这个值承继自设置文件中的;
此时character_set_server被设定为这个默许的字符集;
当创立一个新的数据库时,除非明白指定,这个数据库的字符集被缺省设定为character_set_server;
中选定了一个数据库时,character_set_database被设定为这个数据库默许的字符集;
在这个数据库里创立一张表时,表默许的字符集被设定为character_set_database,也就是这个数据库默许的字符集;
当在表内设置一栏时,除非明白指定,不然此栏缺省的字符集就是表默许的字符集;
这个字符集就是数据库中实践存储数据接纳的字符集,mysqldump出来的内容就是这个字符集下的;
当我们依照本来的体例经由过程PHP存取MySQL数据库时,就算设置了表的默许字符集为utf8而且经由过程UTF-8编码发送查询,你会发明存进数据库的仍旧是乱码。成绩就出在这个connection毗连层上。
想要举行“准确”的存储和失掉“准确”的了局,最便利的是在一切query入手下手之前实行一下:
SETNAMESgbk;
个中gbk是数据库字符集。
它相称于上面的三句指令:
SETcharacter_set_client=gbk;
SETcharacter_set_results=gbk;
SETcharacter_set_connection=gbk;
4.1和5.0默许利用的是latin1字符集(木头:妈的,老外真强横,妄图让全球都是利用瑞典字符集吗)
假如我们只想利用gbk字符集存储和猎取数据,
我们在编译mysql4.1和5.0的时分,必要注重在my.ini大概my.cnf中增加两处参数

[Copytoclipboard][-]
CODE:
[mysqld]
default-character-set=utf8


[Copytoclipboard][-]
CODE:
#settingsforclients(connection,results,clients)
[mysql]
default-character-set=utf8
上面我们来讲主题,怎样转换数据库字符集
两种办法,

QUOTE:
第一种----变动存储字符集
次要的头脑就是把数据库的字符集有latin1改成gbk,big5,大概utf8;以下操纵必需具有主机权限。假定以后操纵的数据库名为:database
导出
起首必要把数据导为mysql4.0的格局,详细的命令以下:
mysqldump-uroot-p--default-character-set=latin1--set-charset=gbk--skip-optdatabse>d4.sql
--default-characte-set之前数据库的字符集,这个一样平常情形下都是latin1的,
--set-charset导出的数据的字符集,这个能够设置为gbk,utf8,大概big5
导进
起首利用上面语句新建一个GBK字符集的数据库(test)
CREATEDATABASE`d4`DEFAULTCHARACTERSETgbkCOLLATEgbk_chinese_ci;
然后把方才导出的数据导进到以后的数据库中就ok了。
mysql-uroot-p--default-character-set=gbk-fd4<d4.sql
经由过程以上的导出和导进就把数据库的字符集改成准确的存储体例了。
个中d4为新建库的称号,d4.sql为导出文件的名字
可是这类办法,发明数据库数据存储量无故变年夜30%,真是忧郁


QUOTE:
别的一种实在道理不异,可是必要手动操纵,一样平常用于第一种办法失利后的选择
不外这类办法假如数据库很年夜,估量很难做,由于光翻开文件就可以让你逝世机
起首仍是用phpmyadmin大概用mysql自己的dump导出.sql文件
然后用UltraEdit翻开你备份的一切xxxx.sql文件,查找

[Copytoclipboard][-]
CODE:
DEFAULTCHARSET=latin1
latin1这里大概是其余,归正是你不想要的,要转成gbk大概big5的字符集
把这个交换为“空”
在查找

[Copytoclipboard][-]
CODE:
CREATETABLEcdb_sessions(
sidchar(6)charactersetlatin1collatelatin1_binNOTNULLdefault,
ip1tinyint(3)unsignedNOTNULLdefault0,
ip2tinyint(3)unsignedNOTNULLdefault0,
ip3tinyint(3)unsignedNOTNULLdefault0,
ip4tinyint(3)unsignedNOTNULLdefault0,
uidmediumint(8)unsignedNOTNULLdefault0,
usernamechar(15)NOTNULLdefault,
groupidsmallint(6)unsignedNOTNULLdefault0,
styleidsmallint(6)unsignedNOTNULLdefault0,
invisibletinyint(1)NOTNULLdefault0,
`action`tinyint(1)unsignedNOTNULLdefault0,
lastactivityint(10)unsignedNOTNULLdefault0,
fidsmallint(6)unsignedNOTNULLdefault0,
tidmediumint(8)unsignedNOTNULLdefault0,
nicknamechar(15)NOTNULLdefault,
UNIQUEKEYsid(sid)
)ENGINE=HEAPMAX_ROWS=1000;
交换为

[Copytoclipboard][-]
CODE:
CREATETABLE`cdb_sessions`(
`sid`char(6)binaryNOTNULLdefault,
`ip1`tinyint(3)unsignedNOTNULLdefault0,
`ip2`tinyint(3)unsignedNOTNULLdefault0,
`ip3`tinyint(3)unsignedNOTNULLdefault0,
`ip4`tinyint(3)unsignedNOTNULLdefault0,
`uid`mediumint(8)unsignedNOTNULLdefault0,
`username`char(15)NOTNULLdefault,
`groupid`smallint(6)unsignedNOTNULLdefault0,
`styleid`smallint(6)unsignedNOTNULLdefault0,
`invisible`tinyint(1)NOTNULLdefault0,
`action`tinyint(1)unsignedNOTNULLdefault0,
`lastactivity`int(10)unsignedNOTNULLdefault0,
`fid`smallint(6)unsignedNOTNULLdefault0,
`tid`mediumint(8)unsignedNOTNULLdefault0,
`nickname`char(15)NOTNULLdefault,
UNIQUEKEY`sid`(`sid`)
)TYPE=HEAPMAX_ROWS=2000;
这一步更加复杂的举措就是删撤除关于cdb_sessions表的这一段,未来全新装一个d4,将这个表导出
将其内容复制,粘贴到sql文件的最初面
保留后,再把这个sql文件导进到你的库中
就OK了
用这两种办法就能够很便利的把4.1和5.0的mysql数据库升级到4.0
复杂的历程就是
A导出4.1/5.0的库
B举行处置,转换成gbk字符集
C完全卸载4.1大概5.0
D安装4.0.26
E然后导进处置完的库
升级的时分导出库能够用这个办法
mysqldump-uroot-p--default-character-set=latin1--set-charset=gbk--skip-optdatabse--compatible=mysql40>d4.sql
如许导出的就是4.0的库勒
至于mysql版本的晋级,
假如数据文件中有中文信息,那末将MySQL4.0的数据文件,间接拷贝到MySQL4.1中就是不成以的,即使在my.ini中设置了default-character-set为准确的字符集。固然貌似没有成绩,但MySQL4.1的字符集有一处十分末路人的中央,以gbk为例,底本MySQL4.0数据中varchar,char等长度城市变成本来的一半,如许存储中文容量稳定,而英文的存储容量就少了一半。这是间接拷贝数据文件带来的最年夜成绩。
以是,晋级的基本,假如想利用“准确”的字符集,仍是先用mysqldump导出成文件,然后导进。
解决方案提供商应记住DBaaS通常仅仅是解决方案的一部分。客户之所以与他们的解决方案提供商协同工作,不仅是因为他们出售的产品,而且还因为他们所提供的服务。
只想知道 该用户已被删除
沙发
发表于 2015-1-18 18:53:17 | 只看该作者
我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
柔情似水 该用户已被删除
板凳
发表于 2015-1-27 18:12:16 | 只看该作者
是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。
飘灵儿 该用户已被删除
地板
发表于 2015-2-5 14:37:21 | 只看该作者
很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。
蒙在股里 该用户已被删除
5#
发表于 2015-2-12 07:27:23 | 只看该作者
备份方面可能还是一个老大难的问题。不能单独备份几个表总是感觉不爽。灵活备份的问题不知道什么时候才能解决。
变相怪杰 该用户已被删除
6#
发表于 2015-3-3 01:20:24 | 只看该作者
XML字段类型更好的解决了XML数据的操作。XQuery确实不错,但是个人对其没好感。(CSDN的开发者应该是相当的熟了!)
精灵巫婆 该用户已被删除
7#
发表于 2015-3-11 08:47:36 | 只看该作者
微软对CLR作了大篇幅的宣传,这是因为数据库产品终于融入.net体系中。最开始我们也是狂喜,感觉对象数据库的一些概念可以实现了。
活着的死人 该用户已被删除
8#
发表于 2015-3-18 03:24:11 | 只看该作者
只能告诉你,学好数据库语言和原理,多见识几种数据库软件,比一棵树上吊死要好。
若相依 该用户已被删除
9#
发表于 2015-3-25 11:43:40 | 只看该作者
一个是把SQL语句写到客户端,可以使用DataSet进行加工;
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-2 18:31

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表