程序設(shè)計(jì)實(shí)用案例選講(袁衛(wèi)華)在mysql中有幾種方法可以用來建立帳戶_第1頁(yè)
程序設(shè)計(jì)實(shí)用案例選講(袁衛(wèi)華)在mysql中有幾種方法可以用來建立帳戶_第2頁(yè)
程序設(shè)計(jì)實(shí)用案例選講(袁衛(wèi)華)在mysql中有幾種方法可以用來建立帳戶_第3頁(yè)
程序設(shè)計(jì)實(shí)用案例選講(袁衛(wèi)華)在mysql中有幾種方法可以用來建立帳戶_第4頁(yè)
程序設(shè)計(jì)實(shí)用案例選講(袁衛(wèi)華)在mysql中有幾種方法可以用來建立帳戶_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、在mysql中有幾種方法可以用來建立帳戶:i 1 .create userxcreate user user identified by password 'password',user identified by password 'password'create user川于倉(cāng)u建新的mysql賬戶。要使川create user,您必須擁冇 mysql數(shù)據(jù)庫(kù)的全局create user權(quán)限,或擁有insert權(quán)限。對(duì)于每個(gè)賬戶,cre ate user會(huì)在沒冇權(quán)限的mysql.user表中創(chuàng)建一個(gè)新記錄。如果賬戶已經(jīng)存在,則出 現(xiàn)錯(cuò)誤。使用自選的identi

2、fied by 了句,可以為賬戶給定一個(gè)密碼。user值和 密碼的給 定方法和grant語句一樣。特別是,要在純文木屮指定密碼,需忽略password關(guān)鍵 詞。要把 密碼指定為由password()函數(shù)返回的混編值,需包含關(guān)鍵字passwordoi 2使用grant語句|最好的方法是使用grant語句,因?yàn)檫@樣更精確,錯(cuò)謀少。從mysql 3.22.11起提 供了 grant;它的主要用途是來給帳戶授權(quán)的,但也可用來建立新帳戶并同時(shí)授權(quán)。注意: 當(dāng)mysql運(yùn)行于no_auto_create_user時(shí)要提供新建用戶的密碼,否則不能創(chuàng)新用戶。 下面的示例說明如何使用mysql客戶端程序來設(shè)置新

3、用戶。首先,使用mysql程序以mysql root用戶來連接服務(wù)器:shell> mysql -user=root mysql如果你為root賬戶指定了密碼,還需要為該mysql命令和木節(jié)中的其它命令提供一pa ssword或-p選項(xiàng)。以root連接到服務(wù)器上后,可以添加新賬戶。下面的語句使用grant來設(shè)置四個(gè)新賬 戶:mysql> grant all privileges on *. * to fonty'' localhost'> identified by 'some_pass' with grant opt i on;mys

4、ql> grant all privileges on *. * to fonty''%'> identified by 'some_pass' with grant opt i on;mysql> grant reload, process on *. * to ' admin'' i oca i host' mysql> grant usage on *. * to ' dummy'i oca i host'用grant語句創(chuàng)建的賬戶有下面的屬性:其中兩個(gè)賬戶有相同的用戶

5、名monty和密碼some_passo兩個(gè)賬八均為超級(jí)用戶賬戶,具何完全的權(quán)限可以做任何事情。一個(gè)賬戶('monty,local host')只用于從木機(jī) 連接時(shí)。另一個(gè)賬/'(' monty* * %* )可用于從其它主機(jī)連接。請(qǐng)注意monty的兩個(gè)賬八必須能 從任何主機(jī)以monty連接。沒有l(wèi)ocal host賬戶,當(dāng)monty從木機(jī)連接時(shí),mysql_install_ db創(chuàng)建的localhost的匿名用戶賬戶將占先。結(jié)果是,monty將被視為匿名用戶。原因是匿 名用戶賬戶的host列值比f monty1 0 %,賬戶更具體,這樣在use表排序順序屮排在前

6、面。(u ser表排序的討論要參考mysql手冊(cè))。 一個(gè)賬八有用八名admin,沒有密碼。該賬戶只用于從本機(jī)連接。授了了 rel oad和process管理權(quán)限。這些權(quán)限允許admin用戶執(zhí)行mysqladmin reloads mysqladmin refresh 和 mysqladmin flush-xxx 命令,以及 mysqladmin processlisto 未授予訪問數(shù)據(jù) 庫(kù)的權(quán)限。你可以通過grant語句添加此類權(quán)限。 一個(gè)賬戶有用戶名dummy,沒有密碼。該賬戶只用于從本機(jī)連接。未授了權(quán)限。 通過grant語旬屮的usage權(quán)限,你可以創(chuàng)建賬戶而不授予任何權(quán)限。它可以將所有

7、全局權(quán) 限設(shè)為假定你將在以后將具體權(quán)限授予該賬戶。:3直接操作mysql授權(quán)表x彳 一 一 除了 grant,你可以直接用insert語句創(chuàng)建相同的賬戶,然后使用flush privile ges告訴服務(wù)器重載授權(quán)表。shell> mysq i user二root mysqlmysql>insert into user->values ('1 oca 1 host*, fonty', password (f some_pass'),->f y,f 丫,y,9 y,f y,9 y,9 y,y,9 y,9 y,9 y,9 y,y,9 y,) mysq

8、l>insert into user->valuesmonty', password (' some_pass,),_>'y',' y',' y',' y',' y',' y',' y',' y', ' y',' y' ,' y',' y',' y',' y');mysql> insert into user set host二

9、9;i oca i host',user二'admin',-> reload_priv=, y*, process_pr iv=, yr ;mysqi> insert into user (host, user,password)-> values c i oca i host', dummy1,');mysqi> flush privileges;當(dāng)你用insert創(chuàng)建賬戶時(shí)使用flush privileges的原因是告訴服務(wù)器重讀授權(quán)表。否 則,只有重啟服務(wù)器后更改方會(huì)被注意到。使用grant,則不需要使用flush pr i

10、vi leges0用insert使用password0函數(shù)是為了加密密碼。grant語句為你加密密碼,因此不需 要 password ()。'y,值啟用賬戶權(quán)限。對(duì)于admin賬戶,還可以使用更加可讀的insert擴(kuò)充的語法(使 用 set) o在為dummy賬戶的insert語句中,只有user表中的host、user和password列記錄 為指定的值。沒有一個(gè)權(quán)限列為顯式設(shè)置,因此mysql將它們均指定為默認(rèn)值衛(wèi)。這樣 等同于grant usage的操作。請(qǐng)注意要設(shè)置超級(jí)用戶賬戶,只需耍創(chuàng)建一個(gè)權(quán)限列設(shè)置為'y,的user表?xiàng)l目。user 表權(quán)限為全局權(quán)限,因此其它授權(quán)表

11、不再需要條目。i 4舉幾個(gè)應(yīng)用grant創(chuàng)建帳戶和授權(quán)的例子§卜-面的例子創(chuàng)建3個(gè)賬戶,允許它們?cè)L問專川數(shù)據(jù)庫(kù)。每個(gè)賬戶的川戶名為custom, 密碼為obscureo要想用grant創(chuàng)建賬戶,使用下面的語句:shel l> mysql -user二root mysqlshe 11> mysqi 一一user二root mysqlmysql> grant select, insert, update, delete, create, drop->on bankaccount. *->to 'custom'i oca i host'

12、->identified by 'obscure'mysqi> grant select, insert, update, delete, create, drop->on expenses. *->to 'custom'whitehouse. gov'->identified by 'obscure'mysqi> grant select, insert, update, delete, create, drop->on customer. *->to ' custom'&

13、#39;server.domai n'->identified by 'obscure'這3個(gè)賬戶可以用于: 第1個(gè)賬八可以訪問bankaccount數(shù)據(jù)庫(kù),但只能從本機(jī)訪問。 第2個(gè)賬戶對(duì)以訪問expenses數(shù)據(jù)庫(kù),但只能從主機(jī)whitehouse, gov訪問。 第3個(gè)賬八可以訪問customer數(shù)據(jù)庫(kù),但只能從主機(jī)server, domain訪問。 要想不用grant設(shè)置custom賬戶,使用insert語句直接修改 授權(quán)表:shel l> mysqi 一一user二root mysqimysqi> insert into user (host

14、, user,password)-> valuesc i oca i host', custom* , password c obscure');mysql> insert into user (host, user, password)-> values (' wh i tehouse. gov', custom1 , password c obscure*);mysqi> insert into user (host, user, password)-> values (' server, doma in',&#

15、39; custom1 , password (' obscure1);mysqi> insert into db-> (host, db, user, se i ect_pr i v, i nsert_pr i v,->update_pr i vr de i ete_pr i v, create_pr i vf drop_pr i v)-> values (* i oca i host*, bankaccounf, custom1 ,->'ym j y; y; y,);mysql> insert into db->(host, db,

16、 user, se i ect_pr i v, i nsert_pr i v,-> update_pr iv, delete_pr iv, create_pr iv, drop_pr iv)-> values(* whitehouse, gov',' expenses1 ,' custom1 ,->'ym j y; y; y,);mysql> insert into db->(host, db, user, se i ect_pr i v, i nsert_pr i v,-> update_pr iv, delete_pr i

17、v, create_pr iv, drop_pr iv)-> values (* server doma i n' ,' customer1, custom',->'ym j y; y; y,);mysql> flush privileges;前3個(gè)insert語句在user表屮加入條目,允許用戶custom從各種主機(jī)用給定的密碼 進(jìn)行連接,但不授予全局權(quán)限(所有權(quán)限設(shè)置為 默認(rèn)值'n,)。后面3個(gè)insert語句在use r表中加入條目,為custom授予bankaccount、expenses和customer數(shù)據(jù)庫(kù)權(quán)限,但只能 從

18、合適的主機(jī)訪問。通常若直接修改授權(quán)表,則應(yīng)告訴服務(wù)器用flush privileges重載授 權(quán)表,使權(quán)限更改牛效。如果你想耍讓某個(gè)用戶從給定域的所有機(jī)器訪問(例如,mydomain. com),你可以在賬戶 名的主機(jī)部分使用含'%'通配符的grant語旬:mysq 1 > grant .->on *. *->to ' my name1 %. mydoma i n. com'->identified by 'mypass'要想通過直接修改授權(quán)表來實(shí)現(xiàn):mysq i > insert into user (host,u

19、ser,password,.)-> values (' %. mydoma i n. com', my name' , password (' mypass' mysql> flush pr ivi leges;5創(chuàng)建賬戶的其它方法是使用mysql賬戶管理功能的第三方程序。phpmyadmin即是一個(gè)程序。從mysql刪除用戶賬戶要想移除賬戶,應(yīng)使jij drop user語句。mqsql數(shù)據(jù)庫(kù)中如何查看表結(jié)構(gòu)show database;顯示mysql中建了幾個(gè)數(shù)據(jù)庫(kù)use數(shù)據(jù)庫(kù)名;選擇使用那個(gè)數(shù)據(jù)庫(kù)show tables;顯示選中的數(shù)據(jù)庫(kù)中

20、具冇那些表describe表名;顯示這個(gè)表都有那些字段。myjiaoli2006-06-23 17:28了解了一些最基本的操作命令后,我們?cè)賮韺W(xué)習(xí)如何創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)和數(shù)據(jù)庫(kù)表。1、使用show語句找出在服務(wù)器上當(dāng)前存在什么數(shù)據(jù)庫(kù):mysql> show databases;+| database |+i mysql i| test |+3 rows in set (0.00 sec)2、創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)a beesmysql> create database abccs;注總不同操作系統(tǒng)對(duì)大小寫的敏感。3、選擇你所創(chuàng)建的數(shù)據(jù)庫(kù)mysql> use abccsdatabase c

21、hanged此時(shí)你已經(jīng)進(jìn)入你剛才所建立的數(shù)據(jù)庫(kù)abccs.4、創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)表首先看現(xiàn)在你的數(shù)據(jù)庫(kù)中存在什么表:mysql> show tables;empty set (0.00 sec)說明剛才建立的數(shù)據(jù)庫(kù)中還沒冇數(shù)據(jù)庫(kù)表。下曲來創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)農(nóng)mytable:我們要建立一個(gè)你公司員工的生口表,表的內(nèi)容包含員工姓名、件別、出生口期、出生城市。mysql> create table mytable (name varchar(20), sex char(l),> birth date, birthaddr varchar(20);query ok, 0 rows affec

22、ted (0.00 sec)山于name、birthadd的列值是變化的,因此選擇varchar,其長(zhǎng)度不一定是20。 可以選擇從1到255的任何長(zhǎng)度,如果以后需要改變它的字氏,可以使用alter table語 句。);性別只需一個(gè)字符就可以表示nmh或“f“,因此選用char(l);birth列則使川date 數(shù)據(jù)類型。創(chuàng)建了一個(gè)表后,我們可以看看剛才做的結(jié)果,用show tables顯示數(shù)據(jù)庫(kù)中有哪些 表:mysql> show tables;+-+| tables in menagerie |+4-| mytables |+- +5、顯示表的結(jié)構(gòu):mysql> describ

23、e mytable;om om obobobob om obob ob oa omob«»| field | type | null | key | default | extra |mb mb mb ob mm « «* «» w mbom ob mb mb ob oo « mb mb mb ob obmb mb mb mb mb « mb mb mb obmb| name | varchar(20) | yes | | null | | sex | char(l) | yes | | null | | birt

24、h | date | yes | | null | | deathaddr | varchar(20) | yes | | null | |mb mb mb ob mm « «* «» w mb «om ob mb mb ob oo « mb mb mb ob obmb mb mb mb mb « mb mb mb obmb4 rows in set (0.00 sec)6、往表中加入記錄我們先用select命令來查看表屮的數(shù)據(jù):mysql> select * from mytable;empty set (0.00

25、sec)這說明剛才創(chuàng)建的表還沒有記錄。加入一條新記錄:mysql> insert into mytable-> values cabccs'/f'/19770707'/china');query ok, 1 row affected (0.05 sec)再用上面的select命令看看發(fā)生了什么變化。我們可以按此方法一條一條地將所冇員工 的記錄加入到表中。7、用文本方式將數(shù)據(jù)裝入-個(gè)數(shù)據(jù)庫(kù)表如果-條-條地輸入,很麻煩。我們可以用文本文件的方式將所冇記錄加入你的數(shù)據(jù)庫(kù)表4 創(chuàng)建一個(gè)文本文件''mysql.txr,每行包含一個(gè)記錄,用定位符

26、(tab)把值分開,并且以在 create table語句中列出的列次序給出,例如:a bees f 1977-07-07 chinamary f 1978-12-12 usatom m 1970-09-02 usa使用下面命令將文本文件''mytable.txt"裝載到mytable表屮:mysql> load data local infile ”mytable.txt” into table pet;再使用如下命令看看是否己將數(shù)據(jù)輸入到數(shù)據(jù)庫(kù)表屮:mysql> select * from mytable;在java中解決mysql50中文字符集問題全

27、程詳細(xì)記錄【關(guān)鍵字】:字符集沖文,字符,解決,文字,sql,問題,mysql 查看來源by zieckey ()all rights reserved!今天被mysql的中文字符集問題弄得焦頭爛額,故終還是解決了下面分亨一下解決過程。 在網(wǎng)上搜索了很多,網(wǎng)友也有很多精彩的帖子,但是每個(gè)人的情況不總是一樣,所以我覺得我下面的文字有存在的必要。裝了 mysql5.0后,系統(tǒng)默認(rèn)的字符集似乎是utf8,但是不知道為什么就是不支持中文。 下面的是我的痛苦的解決過程。將數(shù)據(jù)庫(kù)用character set和collate指定字符集為gbk,mysql> create database test2 d

28、efault character set gbk collate gbk_chinese_ci;query ok, 1 row affected (0.00 sec)mysql> create table a(a text);query okz 0 rows affected (0.14 sec)插入的時(shí)候也用_gbk指定字符集,mysql> insert a values(_gbk'默認(rèn)數(shù)據(jù)庫(kù)的字符集和');query ok, 1 row affected (0.05 sec)但是查詢的時(shí)候還是出現(xiàn)亂。mysql> select * from a;+i a

29、i+i榛禪 鍊版岐舉捶娩瀛梶 闆喟推i+1 row in set (0.00 sec)mysql>好的,那么是不是創(chuàng)建農(nóng)也要指定字符集呢?我們繼續(xù)測(cè)試:mysql> create table b(a text) default character set gbk collate gbk_chinese_ci;query ok, 0 rows affected (0.06 sec)mysql> insert b values(_gbk'默認(rèn)數(shù)據(jù)庫(kù)的字符集和');query ok, 1 row affected (0.01 sec)mysql> select

30、 * from b;+i a i+i榛禪 鍊版岷搴捶視瀛梶 闆喟推i+1 row in set (0.00 sec)mysql>同樣出現(xiàn)亂碼?我們不用_gbk指定字符集呢?mysql> insert b values('默認(rèn)數(shù)據(jù)庫(kù)的字符集和');error 1406 (22001): data too long for column 'a' at row 1mysql> insert a values('默認(rèn)數(shù)據(jù)庫(kù)的字符集和');error 1406 (22001): data too long for column lal a

31、t row 1這樣發(fā)現(xiàn)根木就插入不進(jìn)數(shù)據(jù)。那么到底該怎么解決呢?運(yùn)行下面的這兒行命令,就能看到e常的中文了:mysql> set character_set_connection = gbk;query ok, 0 rows affected (0.00 sec)mysql> set character_set_database = gbk;query ok, 0 rows affected (0.00 sec)mysql> set character_set_results = gbk;query ok, 0 rows affected (0.00 sec)mysql>

32、; set character_set_server = gbk;query ok, 0 rows affected (0.00 sec)mysql>mysql> set collation_connection = gbk_bin;query ok, 0 rows affected (0.00 sec) mysql> set collation_database = gbk_bin;query ok, 0 rows affected (0.00 sec)mysql> set collation_server = gbk_bin;query ok, 0 rows aff

33、ected (0.00 sec) mysql>mysql> select * from a;+i a i+i默認(rèn)數(shù)據(jù)庫(kù)的字符集和i+1 row in set (0.00 sec) mysql> select * from b;+i a i+i默認(rèn)數(shù)據(jù)庫(kù)的字符集和i+1 row in set (0.00 sec)mysql>這樣設(shè)置z后,也可以正常插入中文了:mysql> insert into a values('當(dāng)然是聯(lián)系 java ');query ok, 1 row affected (0.02 sec) mysql> select *

34、 from a;+1 a i+i默認(rèn)數(shù)據(jù)庫(kù)的字符集和ii當(dāng)然是聯(lián)系java |+2 rows in set (0.00 sec)mysql>但是如果巫卅數(shù)據(jù)庫(kù)客戶端,那么還是不能e確顯示中文, 最徹底的方法就是更改mysql的配置文件。在mysql5.0的安裝目錄找到my.ini文件,將其中以下兩行:default-character-set=utf8default-character-set=utf8改為:default-character-set=gbk default-character-set=gbk重啟mysql服務(wù)器。重新連接:mysql> select * from

35、a;+1 a i+i默認(rèn)數(shù)據(jù)床的字符集和ii當(dāng)然是聯(lián)系java |+2 rows in set (0.02 sec)現(xiàn)在好了,可以直接讀取中文字符了??纯床迦胫形淖址闆r:mysql> insert b values(*看看插入中文字符情況:');mysql> insert b values('看看插入中文字符情況:query ok, 1 row affected (0.03 sec)mysql> select * from b;+1 a i+i默認(rèn)數(shù)據(jù)庫(kù)的字符集和ii看看插入中文字符情況:i+2 rows in set (0.00 sec)mysql>

36、下面再看看創(chuàng)建衣的情況:mysql> create table c(a text);query ok, 0 rows affected (0.06 sec)mysql> insert into c values();query ok, 1 row affected (0.01 sec)mysql> insert into c values('下面再看看創(chuàng)建表的情況:');query ok, 1 row affected (0.02 sec)mysql> select * from c;+1 a i+| null |i下面再看看創(chuàng)建表的情況:|+2 row

37、s in set (0.00 sec)mysql>一切正常了。下面看看程序中的情況:package test;*該程序用來測(cè)試jdbc和mysql連接,然后插入中文字符到數(shù)據(jù)庫(kù)屮。*其中用到的表為:* create table messageboard (* id int(10) unsigned not null default '0;* title varchar(255) not null default "z* content text not null,* author varchar(20) not null default ",* time da

38、tetime not null default '0000-00-00 00:00:00',* modifytime datetime not null default *0000-00-00 00:00:00;* primary key (id)*);*/import java.sql.*;public class insertchinesecharacterjdbcstatictry驅(qū)動(dòng)和odbe不同class.forname ( "org.gjt.mm.mysql.driver");system.out.println ( "success

39、loading mysql driver."); catch ( exception e )system.out.println ( "error loading mysql driver.");e.printstacktrace ();/* param args*/public static void main ( string agrs)<try連接參數(shù)與access不同string url = "jdbc:mysql:/localhost/bohaodb"建立連接connection con = drivermanager.getc

40、onnection ( url, "root", "011124"); 建立發(fā)送sql命令的statement對(duì)象statement stmt = con.createstatement ();返回查詢結(jié)果intflag=stmt.executeupdate("in sertintomessageboard(id,title,content,author,time,modifytime) values(l/大家好! 我是新來,請(qǐng)多多 關(guān)照!7zieckey72007-01-28 20:03:5072007-01-27 20:03:50'

41、);” );if ( l = =flag )<system.out.printin (”插入中文字符到數(shù)據(jù)庫(kù)成功! ”);else system.out.println (”插入中文字符到數(shù)據(jù)庫(kù)失?。?“);resultset rs = stmt.executequery ( "select * from messageboard");/*取出列屬性!tresultsetmetadata md = rs.getmetadata (); int col = md.getcolumncount ();for (in t i = 1; i <= col; i+ )sy

42、stem.out.println ( md.getcolumnname ( i ) + nth );/*取出列值!*/while ( rs.next ()string strdata =for (in t i = 1; i <= col; i+ )strdata = strdata + rs.getstring ( i ) + "t"system.out.println ( strdata );斷開connection連接rs.close();stmt.closeo;con.close (); catch ( sqlexception e ) e.printstack

43、trace ();運(yùn)行輸出:success loading mysql driver.插入中文字符到數(shù)據(jù)庫(kù)成功!idtitlecontentauthortimemodifytime1 大家好!我是新來,請(qǐng)多多關(guān)照! zieckey 2007-01-28 20:03:50.0 2007-01-27 20:03:50.0mysql 4.1的編碼問題【關(guān)鍵字】:編碼,問題,mysql,utf8,字符集,默認(rèn)擻據(jù)庫(kù),set查看來源下面要寫的是一篇非常無聊的東西,充斥了大量各式各樣的編碼、轉(zhuǎn)換、客戶端、服務(wù)器端、連接呃, 我自己都不愿意去看它,但想一想,寫下來還是冇點(diǎn)意義的,原因冇四:mysql 4.1

44、對(duì)多語言的支持有了很人變化(這導(dǎo)致了問題的出現(xiàn));盡管大部分的地方(包括個(gè)人使用和主機(jī)提供商),mysql 3仍然占主導(dǎo)地位;但mysql 4.1是mysql官方推薦的數(shù)據(jù)庫(kù),己經(jīng)有主機(jī)提供商開始提供并將會(huì)越來越多;許多php程序以mysql作為默認(rèn)的數(shù)據(jù)庫(kù)管理軟件,但它們一般不區(qū)分mysql4.1與4.1以下版 本的區(qū)別,籠統(tǒng)地稱''mysql 3.xx.xx以上版本"就滿足安裝需求了;因?yàn)閘atinl在許多地方(f邊會(huì)詳細(xì)描述貝體是哪些地方)作為默認(rèn)的字符集,成功的蒙蔽了許多php 程序的開發(fā)者和用戶,掩蓋了在中文等語言環(huán)境下會(huì)出現(xiàn)的問題;簡(jiǎn)單的說,mysql自身

45、的變化和使用mysql的php程序?qū)Υ撕雎?,?dǎo)致了問題的出現(xiàn)和復(fù)雜化,而 由于人部分用戶使用的是英文,使這種問題不被重視。這里提到的php程序,主要就wordpress而言。 mysql4.1字符集支持的原理mysql 4.1對(duì)丁字符集的指定可以細(xì)化到一臺(tái)機(jī)器上安裝的mysql,其中的一個(gè)數(shù)據(jù)庫(kù),其中的一張 表,其中的一欄,應(yīng)該川什么字符集。但是,傳統(tǒng)的web程序在創(chuàng)建數(shù)據(jù)庫(kù)和數(shù)據(jù)表時(shí)并沒有使用那么 復(fù)雜的配置,它們用的是默認(rèn)的配置,那么,默認(rèn)的配置從何而來呢?編譯mysql時(shí),指定了一個(gè)默認(rèn)的字符集,這個(gè)字符集是latinl;安裝mysql時(shí),可以在配置文件(my.ini)中指定一個(gè)默認(rèn)的的

46、字符集,如果沒指定,這個(gè)值繼承自編 譯時(shí)指定的;啟動(dòng)mysqld時(shí),可以在命令行參數(shù)中指定一個(gè)默認(rèn)的的字符集,如果沒指定,這個(gè)值繼承自配置文件中 的;此時(shí)character_set_server被設(shè)定為這個(gè)默認(rèn)的字符集;當(dāng)創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)時(shí),除非明確指定,這個(gè)數(shù)據(jù)庫(kù)的字符集被缺省設(shè)定為character_set_server; 當(dāng)選定了一個(gè)數(shù)據(jù)庫(kù)時(shí),character_set_database被設(shè)定為這個(gè)數(shù)據(jù)庫(kù)默認(rèn)的字符集;在這個(gè)數(shù)據(jù)庫(kù)里創(chuàng)建一張表時(shí),農(nóng)默認(rèn)的字符集被設(shè)定為character_set_database,也就是這個(gè)數(shù)據(jù)庫(kù) 默認(rèn)的字符集;當(dāng)在表內(nèi)設(shè)置一欄時(shí),除非明確指定,否則此欄

47、缺省的字符集就是表默認(rèn)的字符集;這個(gè)字符集就是數(shù)據(jù)庫(kù)中實(shí)際存儲(chǔ)數(shù)據(jù)采用的字符集,mysqldump出來的內(nèi)容就是這個(gè)字符集下的; 簡(jiǎn)單的總結(jié)一下,如果什么地方都不修改,那么所有的數(shù)據(jù)庫(kù)的所有表的所有欄位的都用latinl存儲(chǔ), 不過我們?nèi)绻惭bmysql, -般都會(huì)選擇多語言支持,也就是說,安裝程序會(huì)自動(dòng)在配置文件中把 default_character_set設(shè)置為utf-8,這保證了缺省借況下,所有的數(shù)據(jù)庫(kù)的所有表的所有欄位的都 用utf-8存儲(chǔ)。當(dāng)一個(gè)php程序與mysql建立連接后,這個(gè)程序發(fā)送給mysql的數(shù)據(jù)采用的是什么字符集? mysql無從得知(它繪多只能猜測(cè)),所以mysql

48、 4.1要求客戶端必須指能這個(gè)字符集,也就是 character_set_client, mysql的怪異之處在于,得到的這個(gè)字符集并不立即轉(zhuǎn)換為存儲(chǔ)在數(shù)據(jù)庫(kù)中的 那個(gè)字符集,而是先轉(zhuǎn)換為character_set_connection變量指定的一個(gè)字符集;這個(gè)connection層 究竟冇什么用我不大明白,但轉(zhuǎn)換為ch a ra cte r_set_co n n ect i o n的這個(gè)字符集z后,還要轉(zhuǎn)換為數(shù)據(jù) 庫(kù)默認(rèn)的字符集,也就是說要經(jīng)過兩次轉(zhuǎn)換;當(dāng)這個(gè)數(shù)據(jù)被輸出時(shí),又要山數(shù)據(jù)庫(kù)默認(rèn)的字符集轉(zhuǎn)換為 character_set_results 指定的字符集。一個(gè)典型的環(huán)境典型的環(huán)境以我自

49、己的電腦上安裝的mysql 4.1為例,我自己的電腦上安裝著apache 2, php 5和 wordpress 1.5.1.3, mysql 配置文件中指定了 defauit_character_set 為 utf8o 于是問題出現(xiàn)了:wordpress按照默認(rèn)悄況安裝,所以所冇的表都用utf8存儲(chǔ)數(shù)據(jù);wordpress默認(rèn)采用的瀏覽字符集是utf8 (options->reading中設(shè)置),因此所有wp頁(yè)而的 meta 中會(huì)說明 charset 是 utf-8:所以瀏覽器會(huì)以u(píng)tf-8方式顯示所有的wp頁(yè)面;這樣一來write的所有post,和comment都會(huì) 以u(píng)tf-8格式

50、從瀏覽器發(fā)送給apache,再由apache交給php:所以wp從所冇的農(nóng)單中得到的數(shù)據(jù)都是utf-8編碼的;wp不加轉(zhuǎn)換的直接把這些數(shù)據(jù)發(fā)送給 mysql;mysql 默認(rèn)設(shè)置的 character_set_client 和 character_set_connection 都是 latinl,此時(shí)怪異的 事情發(fā)生了,實(shí)際上是utf-8格式的數(shù)據(jù),被''當(dāng)作latinl"轉(zhuǎn)換成居然還是轉(zhuǎn)換成latinl,然后再由 這個(gè)latinl轉(zhuǎn)換成utf8,這么兩次轉(zhuǎn)換,有一部分utf-8的字符就丟失了,變成?,最后輸出的時(shí) 候character_set_results默認(rèn)是l

51、atinl,也就輸出為奇怪的東兩了。放神奇的還不是這個(gè),如果wordpress中設(shè)置以gb2312格式閱讀,那么wp發(fā)送給mysql的 gb2312編碼的數(shù)據(jù),被''當(dāng)作latinl"轉(zhuǎn)換后,存進(jìn)數(shù)據(jù)庫(kù)的是一種奇怪的格式(真的是奇怪的格式, mysqldump出來就能發(fā)現(xiàn),無論當(dāng)作utf-8還是當(dāng)作gb2312來讀都是亂碼),但如果這種格式以 latinl輸出出來,居然又能變回gb2312!這會(huì)導(dǎo)致什么現(xiàn)彖呢? wp如果使用mysql4.1數(shù)據(jù)庫(kù),把編碼改用gb2312就正常了,可惜,這種 正常只是貌似正常。如何解決問題如果你已經(jīng)不耐煩了(兒乎是肯定的),google

52、 一下,會(huì)發(fā)現(xiàn)絕大部分的解答是,query之前先執(zhí)行一下: set names ,utf8沒錯(cuò),這是解決方案,但木文的目的是說明,這為什么是解決方案。要保證結(jié)果正確,必須保證數(shù)據(jù)表采用的格式是正確的,也就是說,至少能夠存放所冇的漢字,那么我們 只有兩種選擇,gbk或者utf8,下面討論utf8的情況。因?yàn)榕渲梦募O(shè)置的default_character_set是utf8,數(shù)據(jù)表默認(rèn)采用的就是utf-8建立的。這也應(yīng) 該是所冇采用mysql 4.1的主機(jī)提供商應(yīng)該采用的配置。所以我們耍保證的只是客戶端與mysql交 互之間指定編碼的正確。這只有兩種可能,客戶端以gb2312格式發(fā)送數(shù)據(jù),或者以u(píng)

53、tf-8格式發(fā)送數(shù)據(jù)。如果以 gb2312 格式發(fā)送:set character_set_client='gb2312'set character_set_connection=,utf8,或者set character_set_connection=*gb2312'都是可以的,都能夠保證數(shù)據(jù)在編碼轉(zhuǎn)換中不岀現(xiàn)丟失,也就是保證存儲(chǔ)入數(shù)據(jù)庫(kù)的是止確的內(nèi)容。 怎么保證取出的是正確的內(nèi)容呢?考慮到絕大部分客戶端(包括wp),發(fā)送數(shù)據(jù)的編碼也就是它所希里收 到數(shù)據(jù)的編碼,所以:set character_set_results='gb2312'可以保證取岀給瀏覽

54、器顯示的格式就是gb2312o如果是第二種情況,客戶端以u(píng)tf-8格式發(fā)送(wp的默認(rèn)情況),可以采用下述配置:setcharacter_set_clie nt='utf8set character_set_connection = 'utf8'set character_set_results='utf8'這個(gè)配置就等價(jià)于set names 'utf8'。wp應(yīng)該作什么修改還是那句話,客戶端耍發(fā)給數(shù)據(jù)庫(kù)什么編碼的數(shù)據(jù),數(shù)據(jù)庫(kù)是不可能確切知道的,只能讓客戶端口己說明 所以,wp是必須發(fā)送正確的set.給mysql的。怎么發(fā)送最合適呢?臺(tái)灣

55、的plog同仁給出 了一些建議:首先,測(cè)試服務(wù)器是否>=4.1,編譯時(shí)是否加入了 utf-8支持;是則繼續(xù)然后測(cè)試數(shù)據(jù)廂以什么格式存儲(chǔ)($dbencoding);set names $dbencoding對(duì)于第二點(diǎn),wp的情況是不同的,按照上面的典型配置,只要用wp,肯定數(shù)據(jù)庫(kù)是用utf-8存儲(chǔ)的, 所以耍根據(jù)用戶設(shè)置的以gb2312還是utf8瀏覽來判斷(bloginfo('charset'),們這個(gè)值是要連接 數(shù)據(jù)庫(kù)以后才能得到的,所以效率最高的方式是連接數(shù)據(jù)庫(kù)之后,根據(jù)這個(gè)配置設(shè)冕一次set names, 而不必每次查詢之前都設(shè)置一遍。我的修改方式是這樣的,在 wp

56、ncludes/wp-db.php 屮增加:function set_charset($charset)/ check mysql version first.$serverversi on = mysql_get_server_info($this>dbh);$version = exploded; $serverversion);if ($version0 < 4) return;/ check if utf8 support was compiled in$result = mysql_query(hshow character set like 'utf8'

57、nz$this->dbh);if (mysql_num_rows($result) < = 0) return;if ($charset = 'utf-8' 11 $charset = 'utf-8')$charset = 'utf8;mysql_query("set names '$charset'", $this->dbh);在 wp-settings.php 的 require (abspath . wpinc . vvars.php1);后増加: $wpdb->set_charset(g

58、et_bloginfo(,charset,);發(fā)信人:seven (七七),信區(qū):single標(biāo)題:【合集】錯(cuò)誤如下發(fā)信站:飲水思源(2003年08月06 h 19:24:17星期三),站內(nèi)信件siebzehn (17)于 2003 年 08 刀 06 日 18:30:12 星期三 提到:javasql. sqlexception: syntax error or access violation, message from server: "you have an error in your sql syntax near '001 where 'username&

59、#39;' at linerat com. mysql. jdbc. mysqlto. checkerrorpacket(mysqlto. java:1651)hahabing (想家了)于2003年08月06日18:31:35星期三 提到:sql語法錯(cuò)了你去看看查詢語句的格式仔細(xì)看,一個(gè)單引號(hào),逗號(hào)都有可能導(dǎo)致出錯(cuò)【在siebzehn (17)的大作屮捉到:】javasql. sqlexception: syntax error or access violation, message from server: "you have an error in your sql syntax near '001 where 'username'' at lineat com. mysql. jdbc. mysql10. checkerrorpacket(mysql10. java:1651)si

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論