mysql

 本文爲穆亦風原創,原帖地址 http://club.muzone.cn/viewthread.php?tid=28605
轉貼請註明出處,非常感謝!


最近discuz發佈了新的版本,免費了,用的人更多了,以前使用其它論壇程序和discuz2.5/3.0的紛紛轉換或升級到discuz4.0,可見discuz作爲中國人開發的php論壇程序,確實是非常優秀的,在大家欣喜若狂的時候,也遇到了一些問題

看到不少用戶反映轉換完以後是亂碼的情況,出現這種現象的主要原因是這類用戶使用的都是MySQL(和PHP搭配之最佳組合)4.1以上的版本.下面作一個說明,希望出現這個問題的朋友都能耐心的把這個文檔看完!!!

MySQL(和PHP搭配之最佳組合) 4.1開始,對多語言的支持有了很大變化 (這導致了問題的出現)。儘管大部分的地方 (包括個人使用和主機提供商),MySQL(和PHP搭配之最佳組合) 3、4.0 仍然占主導地位;但 MySQL(和PHP搭配之最佳組合) 4.1 乃至5.0是 MySQL(和PHP搭配之最佳組合) 官方推薦的數據庫,已經有主機提供商開始提供並將會越來越多;因爲 latin1 在許多地方 (下邊會詳細描述具體是哪些地方) 作爲默認的字符集,成功的矇蔽了許多 PHP 程序的開發者和用戶,掩蓋了在中文等語言環境下會出現的問題。

MySQL(和PHP搭配之最佳組合) 4.1開始把多國語言字符集分的更加詳細,所以導致數據庫遷移,或則dz論壇升級到4.0後(dz4.0開始使用gbk或utf-8編碼)出現亂碼問題。

MySQL(和PHP搭配之最佳組合) 4.1的字符集支持(Character Set Support)有兩個方面:字符集(Character set)和排序方式(Collation)。對於字符集的支持細化到四個層次: 服務器(server),數據庫(database),數據表(table)和連接(connection)。

查看系統的字符集和排序方式的設定可以通過下面的兩條命令:

QUOTE:
MySQL(和PHP搭配之最佳組合)> SHOW VARIABLES LIKE 'character_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(和PHP搭配之最佳組合)/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.00 sec)

MySQL(和PHP搭配之最佳組合)> SHOW VARIABLES LIKE 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)
MySQL(和PHP搭配之最佳組合) 4.1 對於字符集的指定可以細化到一臺機器上安裝的 MySQL(和PHP搭配之最佳組合),其中的一個數據庫,其中的一張表,其中的一欄,應該用什麼字符集。但是,傳統的 Web 程序在創建數據庫和數據表時並沒有使用那麼複雜的配置,它們用的是默認的配置,那麼,默認的配置從何而來呢?

編譯 MySQL(和PHP搭配之最佳組合) 時,指定了一個默認的字符集,這個字符集是 latin1;
安裝 MySQL(和PHP搭配之最佳組合) 時,可以在配置文件 (my.ini) 中指定一個默認的的字符集,如果沒指定,這個值繼承自編譯時指定的;
啓動 MySQL(和PHP搭配之最佳組合)d 時,可以在命令行參數中指定一個默認的的字符集,如果沒指定,這個值繼承自配置文件中的;
此時 character_set_server 被設定爲這個默認的字符集;
當創建一個新的數據庫時,除非明確指定,這個數據庫的字符集被缺省設定爲 character_set_server;
當選定了一個數據庫時,character_set_database 被設定爲這個數據庫默認的字符集;
在這個數據庫裏創建一張表時,表默認的字符集被設定爲 character_set_database,也就是這個數據庫默認的字符集;
當在表內設置一欄時,除非明確指定,否則此欄缺省的字符集就是表默認的字符集;
這個字符集就是數據庫中實際存儲數據採用的字符集,MySQL(和PHP搭配之最佳組合)dump 出來的內容就是這個字符集下的;
當我們按照原來的方式通過PHP存取MySQL(和PHP搭配之最佳組合)數據庫時,就算設置了表的默認字符集爲utf8並且通過UTF-8編碼發送查詢,你會發現存入數據庫的仍然是亂碼。問題就出在這個connection連接層上。
想要進行“正確”的存儲和得到“正確”的結果,最方便的是在所有query開始之前執行一下:

SET NAMES 'gbk';
其中gbk是數據庫字符集。

它相當於下面的三句指令:
SET character_set_client = gbk;
SET character_set_results = gbk;
SET character_set_connection = gbk;

4.1和5.0默認使用的是latin1字符集(木頭:媽的,老外真霸道,妄想讓全世界都是使用瑞典字符集嗎)
如果我們只想使用gbk字符集存儲和獲取數據,
我們在編譯MySQL(和PHP搭配之最佳組合) 4.1和 5.0的時候,需要注意在my.ini或者my.cnf中添加兩處參數

CODE:
[Copy to clipboard]
[MySQL(和PHP搭配之最佳組合)d]
default-character-set=utf8


CODE:
[Copy to clipboard]
#settings for clients (connection, results, clients)
[MySQL(和PHP搭配之最佳組合)]
default-character-set=utf8
下面我們來說主題,如何轉換數據庫字符集
兩種方法,

QUOTE:
第一種----更改存儲字符集
主要的思想就是把數據庫的字符集有latin1改爲gbk,big5,或者utf8; 以下操作必須擁有主機權限。假設當前操作的數據庫名爲:database

導出
首先需要把數據導爲MySQL(和PHP搭配之最佳組合)4.0的格式,具體的命令如下:
MySQL(和PHP搭配之最佳組合)dump -uroot -p --default-character-set=latin1 --set-charset=gbk --skip-opt databse > d4.sql

--default-characte-set 以前數據庫的字符集,這個一般情況下都是latin1的,
--set-charset 導出的數據的字符集,這個可以設置爲gbk,utf8,或者big5
導入
首先使用下面語句新建一個GBK字符集的數據庫(test)

CREATE DATABASE `d4` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;
然後把剛纔導出的數據導入到當前的數據庫中就ok了。

MySQL(和PHP搭配之最佳組合) -uroot -p --default-character-set=gbk -f d4通過以上的導出和導入就把數據庫的字符集改爲正確的存儲方式了。

其中d4爲新建庫的名稱,d4.sql爲導出文件的名字

但是這種方法,發現數據庫數據存儲量無端變大30%,真是鬱悶


QUOTE:
另外一種其實原理相同,但是需要手動操作,一般用於第一種方法失敗後的選擇
不過這種方法如果數據庫很大,估計很難做,因爲光打開文件就能讓你死機

首先還是用phpmyadmin或者用MySQL(和PHP搭配之最佳組合)本身的dump導出 .sql文件

然後用UltraEdit打開你備份的所有xxxx.sql文件,查找

CODE:
[Copy to clipboard]
DEFAULT CHARSET=latin1
latin1這裏也許是別的,反正是你不想要的,要轉成gbk或者big5的字符集
把這個替換爲“空”
在查找

CODE:
[Copy to clipboard]
CREATE TABLE cdb_sessions (
sid char(6) character set latin1 collate latin1_bin NOT NULL default '',
ip1 tinyint(3) unsigned NOT NULL default '0',
ip2 tinyint(3) unsigned NOT NULL default '0',
ip3 tinyint(3) unsigned NOT NULL default '0',
ip4 tinyint(3) unsigned NOT NULL default '0',
uid mediumint(8) unsigned NOT NULL default '0',
username char(15) NOT NULL default '',
groupid smallint(6) unsigned NOT NULL default '0',
styleid smallint(6) unsigned NOT NULL default '0',
invisible tinyint(1) NOT NULL default '0',
`action` tinyint(1) unsigned NOT NULL default '0',
lastactivity int(10) unsigned NOT NULL default '0',
fid smallint(6) unsigned NOT NULL default '0',
tid mediumint(8) unsigned NOT NULL default '0',
nickname char(15) NOT NULL default '',
UNIQUE KEY sid (sid)
) ENGINE=HEAP MAX_ROWS=1000;
替換爲

CODE:
[Copy to clipboard]
CREATE TABLE `cdb_sessions` (
`sid` char(6) binary NOT NULL default '',
`ip1` tinyint(3) unsigned NOT NULL default '0',
`ip2` tinyint(3) unsigned NOT NULL default '0',
`ip3` tinyint(3) unsigned NOT NULL default '0',
`ip4` tinyint(3) unsigned NOT NULL default '0',
`uid` mediumint(8) unsigned NOT NULL default '0',
`username` char(15) NOT NULL default '',
`groupid` smallint(6) unsigned NOT NULL default '0',
`styleid` smallint(6) unsigned NOT NULL default '0',
`invisible` tinyint(1) NOT NULL default '0',
`action` tinyint(1) unsigned NOT NULL default '0',
`lastactivity` int(10) unsigned NOT NULL default '0',
`fid` smallint(6) unsigned NOT NULL default '0',
`tid` mediumint(8) unsigned NOT NULL default '0',
`nickname` char(15) NOT NULL default '',
UNIQUE KEY `sid` (`sid`)
) TYPE=HEAP MAX_ROWS=2000;
這一步更爲簡單的辦法就是刪除掉關於cdb_sessions表的這一段,將來全新裝一個d4,將這個表導出
將其內容複製,粘貼到 sql文件的最後面

保存後,再把這個sql文件導入到你的庫中

就OK了
用這兩種方法就可以很方便的把4.1和5.0的MySQL(和PHP搭配之最佳組合)數據庫降級到4.0
簡單的過程就是
A導出4.1/5.0的庫
B進行處理,轉換成gbk字符集
C徹底卸載4.1或者5.0
D安裝4.0.26
E然後導入處理完的庫

降級的時候導出庫可以用這個方法
MySQL(和PHP搭配之最佳組合)dump -uroot -p --default-character-set=latin1 --set-charset=gbk --skip-opt databse --compatible=MySQL(和PHP搭配之最佳組合)40 > d4.sql
這樣導出的就是4.0的庫勒

至於MySQL(和PHP搭配之最佳組合)版本的升級,
如果數據文件中有中文信息,那麼將MySQL(和PHP搭配之最佳組合) 4.0的數據文件,直接拷貝到MySQL(和PHP搭配之最佳組合) 4.1中就是不可以的,即便在my.ini中設置了default-character-set爲正確的字符集。雖然貌似沒有問題,但MySQL(和PHP搭配之最佳組合) 4.1的字符集有一處非常惱人的地方,以gbk爲例,原本MySQL(和PHP搭配之最佳組合) 4.0數據中varchar,char等長度都會變爲原來的一半,這樣存儲中文容量不變,而英文的存儲容量就少了一半。這是直接拷貝數據文件帶來的最大問題。

所以,升級的根本,如果想使用“正確”的字符集,還是先用MySQL(和PHP搭配之最佳組合)dump導出成文件,然後導入。


這裏順便提一個我的好友深海寫的
用於MySQL(和PHP搭配之最佳組合)4.1的論壇數據庫字符集整理工具。

剛寫的,處理部分代碼可能寫得有點齷齪,但是不影響使用,


主要用於處理整理MySQL(和PHP搭配之最佳組合)4.1指定數據庫、表、字段的字符集。

適用於將非允許的字符集範圍內的數據結構(無數據!!)整理爲適合Discuz!允許的字符集範圍。
本文來源於 WEB開發網 原文鏈接:http://www.cncms.com.cn/mysql/3987.htm

 


命令:
測試環境:mysql 5.0.45
【注:可以在mysql中通過mysql> SELECT VERSION();來查看數據庫版本】
整理:leo
一、連接MYSQL。
格式: mysql -h主機地址 -u用戶名 -p用戶密碼
1、連接到本機上的MYSQL。
首先打開DOS窗口,然後進入目錄mysql/bin,再鍵入命令mysql -u root -p,回車後提示你輸密碼.注意用戶名前可以有空格也可以沒有空格,但是密碼前必須沒有空格,否則讓你重新輸入密碼.
如果剛安裝好MYSQL,超級用戶root是沒有密碼的,故直接回車即可進入到MYSQL中了,MYSQL的提示符是: mysql>
2、連接到遠程主機上的MYSQL。假設遠程主機的IP爲:110.110.110.110,用戶名爲root,密碼爲abcd123。則鍵入以下命令:
mysql -h110.110.110.110 -u root -p 123;(注:u與root之間可以不用加空格,其它也一樣)
3、退出MYSQL命令: exit (回車)
二、修改密碼。
格式:mysqladmin -u用戶名 -p舊密碼 password 新密碼
1、給root加個密碼ab12。首先在DOS下進入目錄mysql/bin,然後鍵入以下命令
mysqladmin -u root -password ab12
注:因爲開始時root沒有密碼,所以-p舊密碼一項就可以省略了。
2、再將root的密碼改爲djg345。
mysqladmin -u root -p ab12 password djg345
三、增加新用戶。
(注意:和上面不同,下面的因爲是MYSQL環境中的命令,所以後面都帶一個分號作爲命令結束符)
格式:grant select on 數據庫.* to 用戶名@登錄主機 identified by “密碼”
1、增加一個用戶test1密碼爲abc,讓他可以在任何主機上登錄,並對所有數據庫有查詢、插入、修改、刪除的權限。首先用root用戶連入MYSQL,然後鍵入以下命令:
grant select,insert,update,delete on *.* to [email=test1@”%]test1@”%[/email]” Identified by “abc”;
但增加的用戶是十分危險的,你想如某個人知道test1的密碼,那麼他就可以在internet上的任何一臺電腦上登錄你的mysql數據庫並對你的數據可以爲所欲爲了,解決辦法見2。
2、增加一個用戶test2密碼爲abc,讓他只可以在localhost上登錄,並可以對數據庫mydb進行查詢、插入、修改、刪除的操作(localhost指本地主機,即MYSQL數據庫所在的那臺主機),
這樣用戶即使用知道test2的密碼,他也無法從internet上直接訪問數據庫,只能通過MYSQL主機上的web頁來訪問了。
grant select,insert,update,delete on mydb.* to [email=test2@localhost]test2@localhost[/email] identified by “abc”;
如果你不想test2有密碼,可以再打一個命令將密碼消掉。
grant select,insert,update,delete on mydb.* to [email=test2@localhost]test2@localhost[/email] identified by “”;
下篇我是MYSQL中有關數據庫方面的操作。注意:你必須首先登錄到MYSQL中,以下操作都是在MYSQL的提示符下進行的,而且每個命令以分號結束。
一、操作技巧
1、如果你打命令時,回車後發現忘記加分號,你無須重打一遍命令,只要打個分號回車就可以了。
也就是說你可以把一個完整的命令分成幾行來打,完後用分號作結束標誌就OK。
2、你可以使用光標上下鍵調出以前的命令。
二、顯示命令
1、顯示當前數據庫服務器中的數據庫列表:
mysql> SHOW DATABASES;
注意:mysql庫裏面有MYSQL的系統信息,我們改密碼和新增用戶,實際上就是用這個庫進行操作。
2、顯示數據庫中的數據表:
mysql> USE 庫名;
mysql> SHOW TABLES;
3、顯示數據表的結構:
mysql> DESCRIBE 表名;
4、建立數據庫:
mysql> CREATE DATABASE 庫名;
5、建立數據表:
mysql> USE 庫名;
mysql> CREATE TABLE 表名 (字段名 VARCHAR(20), 字段名 CHAR(1));
6、刪除數據庫:
mysql> DROP DATABASE 庫名;
7、刪除數據表:
mysql> DROP TABLE 表名;
8、將表中記錄清空:
mysql> DELETE FROM 表名;
9、顯示錶中的記錄:
mysql> SELECT * FROM 表名;
10、往表中插入記錄:
mysql> INSERT INTO 表名 VALUES (”hyq”,”M”);
11、更新表中數據:
mysql-> UPDATE 表名 SET 字段名1=’a',字段名2=’b’ WHERE 字段名3=’c';
12、用文本方式將數據裝入數據表中:
mysql> LOAD DATA LOCAL INFILE “D:/mysql.txt” INTO TABLE 表名;
13、導入.sql文件命令:
mysql> USE 數據庫名;
mysql> SOURCE d:/mysql.sql;
14、命令行修改root密碼:
mysql> UPDATE mysql.user SET password=PASSWORD(’新密碼’) WHERE User=’root’;
mysql> FLUSH PRIVILEGES;
15、顯示use的數據庫名:
mysql> SELECT DATABASE();
16、顯示當前的user:
mysql> SELECT USER();
三、一個建庫和建表以及插入數據的實例
drop database if exists school; //如果存在SCHOOL則刪除
create database school; //建立庫SCHOOL
use school; //打開庫SCHOOL
create table teacher //建立表TEACHER
(
id int(3) auto_increment not null primary key,
name char(10) not null,
address varchar(50) default ‘深圳’,
year date
); //建表結束
//以下爲插入字段
insert into teacher values(”,’allen’,'大連一中’,'1976-10-10′);
insert into teacher values(”,’jack’,'大連二中’,'1975-12-23′);
如果你在mysql提示符鍵入上面的命令也可以,但不方便調試。
(1)你可以將以上命令原樣寫入一個文本文件中,假設爲school.sql,然後複製到c://下,並在DOS狀態進入目錄[url=file:////mysql//bin]//mysql//bin[/url],然後鍵入以下命令:
mysql -uroot -p密碼 < c://school.sql
如果成功,空出一行無任何顯示;如有錯誤,會有提示。(以上命令已經調試,你只要將//的註釋去掉即可使用)。
(2)或者進入命令行後使用 mysql> source c://school.sql; 也可以將school.sql文件導入數據庫中。
四、將文本數據轉到數據庫中
1、文本數據應符合的格式:字段數據之間用tab鍵隔開,null值用[url=file:////n]//n[/url]來代替.例:
3 rose 大連二中 1976-10-10
4 mike 大連一中 1975-12-23
假設你把這兩組數據存爲school.txt文件,放在c盤根目錄下。
2、數據傳入命令 load data local infile “c://school.txt” into table 表名;
注意:你最好將文件複製到[url=file:////mysql//bin]//mysql//bin[/url]目錄下,並且要先用use命令打表所在的庫。
五、備份數據庫:(命令在DOS的[url=file:////mysql//bin]//mysql//bin[/url]目錄下執行)
1.導出整個數據庫
導出文件默認是存在mysql/bin目錄下
mysqldump -u 用戶名 -p 數據庫名 > 導出的文件名
mysqldump -u user_name -p123456 database_name > outfile_name.sql
2.導出一個表
mysqldump -u 用戶名 -p 數據庫名 表名> 導出的文件名
mysqldump -u user_name -p database_name table_name > outfile_name.sql
3.導出一個數據庫結構
mysqldump -u user_name -p -d –add-drop-table database_name > outfile_name.sql
-d 沒有數據 –add-drop-table 在每個create語句之前增加一個drop table
4.帶語言參數導出
mysqldump -uroot -p –default-character-set=latin1 –set-charset=gbk –skip-opt database_name > outfile_name.sql

發佈了29 篇原創文章 · 獲贊 8 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章