??xml version="1.0" encoding="utf-8" standalone="yes"?>
RAND()/RAND(N) returns a random floating-point value MySql的文档说”把 ORDER BY RAND()和LIMIT联合使用Q那么就可以来随机选择? SELECT * FROM random ORDER BY RAND() LIMIT 1 当上qSQLq行ӞRAND()必须每次都被解释以便获得新的随机数。同时从explain sql的extra信息我们大致可以推出上面SQL的工作流E? q个q程对于量数据(具体见后面的benchmarks report)是可行的Q但是对于大数据集是很浪Ҏ间的。换而言之,ORDER BY RAND()对于随机选取的scalibility是很差的?/p>
现在回到问题的最初,前天钱斌在察看MySql服务器性能时发现ORDER BY RAND()q个SQL语句非常?数据库表内有q?00,000的数据,以后q要增加)Q然后他提出自己的一个解x?—? 数据插入前随机排序,选取旉序读取。这是一个可行的办法Q成本是必须修改E序。另一斚w我也不愿意放弃MySql提供的RAND()函数?/p>
重新看ORDER BY RAND()的工作流E,可以扑և优化的途径(序列号对应上面的工作程序): 按照q些xQ下面就是设计其实现?/p>
SELECT FLOOR(RAND() * COUNT(*)) AS offset FROM random; 唯一的问题是Q上面是两句独立的SELECT语句Q所以可以用存储q程或者MySql函数来实现? SELECT * FROM random 可以分析出来Q因为RAND()是在[0, 1]区间Q所以结果集数目是在[0, max(id)]之间。这样就说明l果集是不稳定的Q换句话说它可能受外部数据的变化而振动。更致命的缺hRAND()是在WHERE后面的,q样每选择一行,RAND()都要被解释一ơ? SELECT * W二U方案里面嵌套SELECT我们用INNER JOIN来取代。这U取代得RAND()只需要解释运行一ơ。当然它的结果集数目q是停留在[0, max(id)]区间? 最后是benchmarks的一些数? W?U解x? SELECT * FROM random ORDER BY RAND() LIMIT 1
下面要写的是一非常无聊的东西Q充斥了大量各式各样的编码、{换、客L、服务器端、连接……呃Q我自己都不愿意ȝ它,但想一惻I写下来还是有Ҏ义的Q原因有四: 单的_MySQL 自n的变化和使用 MySQL ?PHP E序Ҏ忽略Q导致了问题的出现和复杂化,而由于大部分用户使用的是英文Qɘq种问题不被重视。这里提到的 PHP E序Q主要就 WordPress 而言? MySQL 4.1 对于字符集的指定可以l化C台机器上安装?MySQLQ其中的一个数据库Q其中的一张表Q其中的一栏,应该用什么字W集。但是,传统?Web E序在创建数据库和数据表时ƈ没有使用那么复杂的配|,它们用的是默认的配置Q那么,默认的配|从何而来呢? 单的ȝ一下,如果什么地斚w不修改,那么所有的数据库的所有表的所有栏位的都用 latin1 存储Q不q我们如果安?MySQLQ一般都会选择多语a支持Q也是_安装E序会自动在配置文g中把 当一?PHP E序?MySQL 建立q接后,q个E序发送给 MySQL 的数据采用的是什么字W集QMySQL 无从得知 (它最多只能猜?Q所?MySQL 4.1 要求客户端必L定这个字W集Q也是 典型的环境以我自q电脑上安装的 MySQL 4.1 ZQ我自己的电脑上安装着 Apache 2QPHP 5 ?WordPress 1.5.1.3QMySQL 配置文g中指定了 最奇的还不是q个Q如?WordPress 中设|以 GB2312 格式阅读Q那?WP 发送给 MySQL ?GB2312 ~码的数据,被“当?latin1”{换后Q存q数据库的是一U奇怪的格式 (真的是奇怪的格式Qmysqldump 出来p发现Q无论当?utf-8 q是当作 gb2312 来读都是q)Q但如果q种格式?latin1 输出出来Q居然又能变?GB2312Q?/p>
q会D什么现象呢QWP 如果使用 MySQL 4.1 数据库,把编码改?GB2312 正怺Q可惜,q种正常只是貌似正常?/p>
如果你已l不耐烦?(几乎是肯定的)Qgoogle 一下,会发现绝大部分的解答是,query 之前先执行一下: 要保证结果正,必须保证数据表采用的格式是正的Q也是_臛_能够存放所有的汉字Q那么我们只有两U选择Qgbk 或?utf-8Q下面讨?utf-8 的情c?/p>
因ؓ配置文g讄? q只有两U可能,客户端以 gb2312 格式发送数据,或者以 utf-8 格式发送数据?/p>
如果?gb2312 格式发? 都是可以的,都能够保证数据在~码转换中不出现丢失Q也是保证存储入数据库的是正确的内宏V?/p>
怎么保证取出的是正确的内容呢Q考虑到绝大部分客L (包括 WP)Q发送数据的~码也就是它所希望收到数据的编码,所? 可以保证取出l浏览器昄的格式就?gb2312?/p>
如果是第二种情况Q客L?utf-8 格式发?(WP 的默认情?Q可以采用下q配|? q个配置q价于 q是那句话,客户端要发给数据库什么编码的数据Q数据库是不可能切知道的,只能让客L自己说明白,所以,WP 是必d送正的 对于W二点,WP 的情冉|不同的,按照上面的典型配|,只要?WPQ肯定数据库是用 UTF-8 存储的,所以要Ҏ用户讄的以 GB2312 q是 UTF-8 览来判?( 我的修改方式是这LQ在 ? MySQLimport位于MySQL/bin目录中,是MySQL的一个蝲入(或者说导入Q数据的一个非常有效的工具。这是一个命令行工具。有两个 mysqlimport Meet_A_Geek Customers.txt 注意Q这里Customers.txt是我们要导入数据的文本文Ӟ而Meet_A_Geek是我们要操作的数据库Q数据库中的表名是CustomersQ这里文本文件的数据格式必须与Customers表中的记录格式一_否则MySQLimport命o会出错?/p> 其中表的名字是导入文件的W一个句P.Q前面文件字W串Q另外一个例子:MySQLimport Meet_A_Geek Cus.to.mers.txt 那么我们把文g中的内容导入到数据库Meet_A_Geek 中的Cus表中?/p> 上面的例子中Q都只用C个参敎ͼq没有用到更多的选项Q下面介lMySQLimport的选项 2Q?MySQLimport的常用选项介绍: 选项 功能 -d or --delete 新数据导入数据表中之前删除数据数据表中的所有信?/p> -f or --force 不管是否遇到错误QMySQLimport强制l插入数?/p> -i or --ignore MySQLimport跌或者忽略那些有相同唯一关键字的行, 导入文g中的数据被忽略?/p> -l or -lock-tables 数据被插入之前锁住表Q这样就防止了,你在更新数据库时Q用L查询和更新受到媄响?/p> -r or -replace q个选项与-i选项的作用相反;此选项替代表中有相同唯一关键字的记录?/p> --fields-enclosed- by= char 指定文本文g中数据的记录时以什么括LQ?很多情况下数据以双引h赗?默认的情况下数据是没有被字符括v的?/p> --fields-terminated- by=char 指定各个数据的g间的分隔W,在句号分隔的文g中,分隔W是句号。您可以用此选项指定数据之间的分隔符?/p> 默认的分隔符是蟩格符QTabQ?/p> --lines-terminated- by=str 此选项指定文本文g中行与行之间数据的分隔字W串或者字W?默认的情况下MySQLimport以newline分隔W?/p> 您可以选择用一个字W串来替代一个单个的字符Q?/p> 一个新行或者一个回车?/p> MySQLimport命o常用的选项q有-v 昄版本QversionQ,-p 提示输入密码QpasswordQ等?/p> 3Q?例子Q导入一个以逗号为分隔符的文?/p> 文g中行的记录格式是q样的: "1", "ORD89876", "1 Dozen Roses", "19991226" 我们的Q务是要把q个文g里面的数据导入到数据库Meet_A_Geek中的表格Orders中,我们使用q个命o: bin/MySQLimport –prl –fields-enclosed-by=" –fields-terminated-by=, Meet_A_Geek Orders.txt q个命o可能看v来很不爽Q不q当你熟悉了之后Q这是非常简单的。第一部分Qbin/MySQLimport 批处理是一U非交互式运行MySQLE序的方法,如同您在MySQL中用的命o一P你仍然将使用q些命o?/p> Z实现批处理,您重定向一个文件到MySQLE序中,首先我们需要一个文本文Ӟq个文本文g包含有与我们在MySQL中输入的命o相同的文本?/p> 比如我们要插入一些数据,使用包含下面文本的文?文g名ؓNew_Data.sql,当然我们也可以取名ؓNew_Data.txt及Q何其他的合法名字Qƈ不一定要以后~sqll尾)Q?/p> USE Meet_A_Geek; INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Block"); INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Newton"); INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Simmons"); 注意上面的这些句子的语法都必L正确的,q且每个句子以分L束?/p> 上面的USE命o选择数据库,INSERT命o插入数据?/p> 下面我们要把上面的文件导入到数据库中Q导入之前要认数据库已l在q行Q即是MySQLdq程Q或者说服务QWindows NT下面UCؓ”服务“,unix下面为”进E“)已经在运行?/p> 然后q行下面的命令: bin/MySQL –p 接着按提C入密码,如果上面的文件中的语句没有错误,那么q些数据p导入C数据库中?/p> 命o行中使用LOAD DATA INFILE 从文件中导入数据到数据库: 现在您可能会问自己,"I竟Z么我要输入所有的q些SQL语句到文件中Q然后通过E序q行它们呢??/p> q样看v来好像需要大量的工作。很好,你这h很可能就对了。但是假如你有从所有这些命令中产生的log记录呢?现在q样很,嗯,大多数数据库都会?br />动生数据库中的事g记录?br />log。而大部分log都包含有用过的原始的SQL命o。因此,如果您不能从您现在的数据库中导出数据到新的MySQL数据库中使用Q那么您可以使用 LOAD DATA INFILE q是我们要介l的最后一个导入数据到MySQL数据库中的方法。这个命令与MySQLimport非常怼Q但q个Ҏ可以在MySQL命o行中使用。也是说您可以在所有用API的程序中使用q个命o。用这U方法,您就可以在应用程序中导入您想要导入的数据?/p> 使用q个命o之前QMySQLdq程Q服务)必须已经在运行?/p> 启动MySQL命o行: bin/MySQL –p 按提C入密码,成功q入MySQL命o行之后,输入下面的命令: USE Meet_A_Geek; LOAD DATA INFILE "/home/mark/data.sql" INTO TABLE Orders; 单的Ԍq样会把文件data.sql中的内容导入到表Orders中,如MySQLimport工具一Pq个命o也有一些可以选择的参数。比如您需要把自己的电脑上的数据导入到q程的数据库服务器中Q您可以使用下面的命令: LOAD DATA LOCAL INFILE "C:\MyDocs\SQL.txt" INTO TABLE Orders; 上面的LOCAL参数表示文g是本地的文gQ服务器是您所登陆的服务器?/p> q样qM使用ftp来上传文件到服务器,MySQL替你完成? 您也可以讄插入语句的优先Q如果您要把它标Cؓ低优先QLOW_PRIORITYQ,那么MySQL会{到没有其他q个表的时候,才把插入数据。可以用如下的命oQ?/p> LOAD DATA LOW_PRIORITY INFILE "/home/mark/data.sql" INTO TABLE Orders; 您也可以指定是否在插入数据的时候,取代或者忽略文件与数据表中重复的键倹{替代重复的键值的语法Q?/p> LOAD DATA LOW_PRIORITY INFILE "/home/mark/data.sql" REPLACE INTO TABLE Orders; 上面的句子看h有点W拙Q但却把关键字放在了让您的剖析器可以理解的地斏V?/p> 下面的一寚w项描述了文件的记录格式Q这些选项也是在MySQLimport工具中可以用的。他们在q里看v来有点不同。首先,要用到FIELDS关键字,如果用到q个关键字,MySQL剖析器希望看到至有下面的一个选项Q?/p> TERMINATED BY character ENCLOSED BY character ESCAPED BY character q些关键字与它们的参数跟MySQLimport中的用法是一L. The TERMINATED BY 描述字段的分隔符Q默认情况下是tab字符Q\tQ?/p> ENCLOSED BY描述的是字段的括起字W。比方以引号括v每一个字Dc?/p> ESCAPED BY 描述的{义字W。默认的是反些杠QbackslashQ\ Q? 下面仍然使用前面的MySQLimport命o的例子,用LOAD DATA INFILE语句把同L文g导入到数据库? LOAD DATA INFILE "/home/mark/Orders.txt" REPLACE INTO TABLE Orders FIELDS TERMINATED BY ',' ENCLOSED BY '"'; LOAD DATA INFILE语句中有一个MySQLimport工具中没有特点: LOAD DATA INFILE 可以按指定的列把文g导入到数据库中?/p> 当我们要把数据的一部分内容导入的时候,q个特点很重要。比方说Q我们要从Access数据库升U到MySQL数据库的时候,需要加入一些栏目(?字段/fieldQ到MySQL数据库中Q以适应一些额外的需要?/p> q个时候,我们的Access数据库中的数据仍然是可用的,但是因ؓq些数据的栏?field)与MySQL中的不再匚wQ因此而无法再使用 LOAD DATA INFILE "/home/Order.txt" INTO TABLE Orders(Order_Number, Order_Date, Customer_ID); 如您所见,我们可以指定需要的栏目QfieldsQ。这些指定的字段依然是以括号括vQ由逗号分隔的,如果您遗漏了其中M一个,MySQL会提醒您^_^ Importing Data from Microsoft Access Q从Access中导入数据,略) 您可以看到MySQL有很多可以导入数据的ҎQ然而这些只是数据传输中的一半。另外的一般是从MySQL数据库中导出数据。有许多的原因我们需要导 比方说Macmillan 使用MySQLdump: MySQLdump命o位于MySQL/bin/目录?/p> MySQLdump工具很多斚wcM相反作用的工具MySQLimport。它们有一些同L选项。但MySQLdump能够做更多的事情。它可以?br />整个数据库装载到一个单独的文本文g中。这个文件包含有所有重建您的数据库所需要的SQL命o。这个命令取得所有的模式QSchemaQ后面有解释Qƈ?br />其转换成DDL语法QCREATE语句Q即数据库定义语句)Q取得所有的数据Qƈ且从q些数据中创建INSERT语句。这个工具将您的数据库中所有的?br />计倒{。因为所有的东西都被包含C一个文本文件中。这个文本文件可以用一个简单的批处理和一个合适SQL语句导回到MySQL中。这个工具o人难以置?br />地简单而快速。决不会有半点让人头疼地地方?/p> 因此Q如果您像装载整个数据库Meet_A_Geek的内容到一个文件中Q可以用下面的命oQ?/p> bin/MySQLdump –p Meet_A_Geek > MeetAGeek_Dump_File.txt q个语句也允许您指定一个表q行dump(备䆾/导出/装蝲?)。如果您只是希望把数据库Meet_A_Geek中的表Orders中的整个内容导出C个文Ӟ可以使用下面的命令: bin/MySQLdump –p Meet_A_Geek Orders >MeetAGeek_Orders.txt q个非常的灵z,您甚臛_以用WHERE从句来选择您需要的记录导出到文件中。要辑ֈq样的目的,可以使用cM于下面的命oQ?/p> bin/MySQLdump –p –where="Order_ID > 2000" Meet_A_Geek Orders > Special_Dump.txt MySQLdump工具有大量的选项Q部分选项如下表: 选项/Option 作用/Action Performed --add-drop-table q个选项会在每一个表的前面加上DROP TABLE IF EXISTS语句Q这样可以保证导回MySQL数据库的时候不会出错,因ؓ每次导回的时候,都会首先查表是否存在Q存在就删除 --add-locks q个选项会在INSERT语句中捆上一个LOCK TABLE和UNLOCK TABLE语句。这防止在q些记录被再ơ导入数据库时其他用户对表进行的操作 -c or - complete_insert q个选项使得MySQLdump命ol每一个生INSERT语句加上列(fieldQ的名字。当把数据导出导另外一个数据库时这个选项很有用?/p> --delayed-insert 在INSERT命o中加入DELAY选项 -F or -flush-logs 使用q个选项Q在执行导出之前会hMySQL服务器的log. -f or -force 使用q个选项Q即使有错误发生Q仍然l导?/p> --full q个选项把附加信息也加到CREATE TABLE的语句中 -l or -lock-tables 使用q个选项Q导的时候服务器会l表加锁?/p> -t or -no-create- info q个选项使的MySQLdump命o不创建CREATE TABLE语句Q这个选项在您只需要数据而不需要DDLQ数据库定义语句Q时很方ѝ?/p> -d or -no-data q个选项使的MySQLdump命o不创建INSERT语句?/p> 在您只需要DDL语句Ӟ可以使用q个选项?/p> --opt 此选项打开所有会提高文g导出速度和创造一个可以更快导入的文g的选项?/p> -q or -quick q个选项使得MySQL不会把整个导出的内容d内存再执行导出,而是在读到的时候就写入导文件中?/p> -T path or -tab = path -w "WHERE Clause" or -where = "Where clause " 如前面所讲的Q您可以使用q一选项来过{选将要放到导出文件的数据?/p> 假定您需要ؓ一个表单中要用到的帐号建立一个文Ӟl理要看今年Q?004q_所有的订单QOrdersQ,它们q不对DDL感兴,q且需要文件有逗号分隔Q因样就很容易导入到Excel中?Z完成q个人物Q您可以使用下面的句子: bin/MySQLdump –p –where "Order_Date >='2000-01-01'" –tab = /home/mark –no-create-info –fields-terminated-by=, Meet_A_Geek Orders q将会得到您惌的结果?/p> schemaQ模式The set of statements, expressed in data definition language, that completely describe the structure of a data base. 一l以数据定义语言来表辄语句?该语句集完整地描qC数据库的l构? SELECT INTO OUTFILE Q?/p> 如果您觉得MySQLdump工具不够P׃用SELECT INTO OUTFILE? MySQL同样提供一个跟LOAD DATA 1. 保MySQLdq程Q服务)已经在运?/p> 2. cd /usr/local/MySQL 3. bin/MySQLadmin ping Q?/ 如果q个句子通不q,可以用这个:MySQLadmin -u root -p ping MySQLadmin ping用于MySQLd的状态,is alive说明正在q行Q出错则可能需要用户名和密码?/p> 4. 启动MySQL 监听E序. 5. bin/MySQL –p Meet_A_GeekQ?/ q入MySQL命o行,q且打开数据库Meet_A_Geek,需要输入密?/p> 6. 在命令行中,输入一下命? SELECT * INTO OUTFILE '/home/mark/Orders.txt' FIELDS TERMINATED BY = ',' FROM Orders WHERE Order_Date >= '2000-01-01' 在你按了ReturnQ回车)之后Q文件就创徏了。这个句子就像一个规则的SELECT语句Q只是把惛_q的输出重定向到了文件中。这意味q您可以使用JOIN来实现多表的高查询。这个特点也可以被用作一个报表生器?/p> 比方_您可以组合这一章中讨论的方法来产生一个非常有的查询Q试试这个: 在MySQL目录建立一个名为Report_G.rpt 的文本文Ӟ加入下面的行Q?/p> USE Meet_A_Geek; INSERT INTO Customers (Customer_ID, Last_Name, First_Name) VALUES (NULL, "Kinnard", "Vicky"); INSERT INTO Customers (Customer_ID, Last_Name, First_Name) VALUES (NULL, "Kinnard", "Steven"); INSERT INTO Customers (Customer_ID, Last_Name, First_Name) VALUES (NULL, "Brown", "Sam"); SELECT Last_Name INTO OUTFILE '/home/mark/Report.rpt' FROM Customers WHERE Customer_ID > 1; 然后认 MySQLq程在运行,q且您在MySQL目录中, 输入下面的命令: bin/MySQL
RAND()
是MySql的一个内嵌函敎ͼ主要用来生成随机数?/p>
v
between 0
and 1
inclusive (that is, in the range 0
<= v
<= 1.0
). If an integer argument N
is specified, it is used as the seed value, which produces a repeatable sequence of column values.ORDER BY RAND()
combined with LIMIT
is useful for selecting a random sample from a set of rows)? 例如:
SELECT * FROM random LIMIT offset, 1;
WHERE id >= (SELECT FLOOR(MAX(id) * RAND()) FROM random )
ORDER BY id ASC LIMIT 1;
FROM random AS r JOIN (SELECT FLOOR(RAND() * SELECT MAX(id) FROM random) AS id ) AS r0
WHERE r.id >= r0.id
ORDER BY r.id ASC LIMIT 1;
W?U解x? SELECT * FROM random WHERE id >= (SELECT FLOOR(MAX(id) * RAND()) FROM random ) ORDER BY id ASC LIMIT 1;
W?U解x? SELECT * FROM random AS r JOIN (SELECT FLOOR(RAND() * SELECT MAX(id) FROM random) AS id ) AS r0 WHERE r.id >= r0.id ORDER BY r.id ASC LIMIT 1;
上述三种Ҏ都分别独立运?00ơ?/p>
random数据大小
W?U解x?/td>
W?U解x?/td>
W?U解x?/td>
100
0.08s
0.08s
0.02s
500
0.08s
0.80s
0.00-0.01s
1000
0.14s
2.00s
0.02s
10000
1.53s
65.02s
0.00-0.02s
100000
15.83s
0.00-0.02s
]]>
insert into t1 values(133024);
insert into t1 values(133036);
insert into t1 values(133037);
insert into t1 values(133038);
insert into t1 values(133039);
insert into t1 values(133046);
insert into t1 values(133191);
insert into t1 values(133192);
insert into t1 values(133193);
insert into t1 values(133194);
insert into t1 values(133207);
select no from (
select no,lag(no,1,null) over(order by no) no1,no-lag(no,1,null) over(order by no) bal
from t1)
where bal=1
union
select no1 from (
select no,lag(no,1,null) over(order by no) no1,no-lag(no,1,null) over(order by no) bal
from t1)
where bal=1;
]]>
A MySQL 4.1 Story
MySQL 4.1 字符集支持的原理
character_set_server
被设定ؓq个默认的字W集Q?/li>
character_set_server
Q?/li>
character_set_database
被设定ؓq个数据库默认的字符集;character_set_database
Q也是q个数据库默认的字符集;default_character_set
讄?UTF-8Q这保证了缺省情况下Q所有的数据库的所有表的所有栏位的都用 UTF-8 存储?/p>
character_set_client
QMySQL 的怪异之处在于Q得到的q个字符集ƈ不立卌{换ؓ存储在数据库中的那个字符集,而是先{换ؓ character_set_connection
变量指定的一个字W集Q这?connection 层究竟有什么用我不大明白,但{换ؓ character_set_connection
的这个字W集之后Q还要{换ؓ数据库默认的字符集,也就是说要经q两ơ{换;当这个数据被输出Ӟ又要由数据库默认的字W集转换?character_set_results
指定的字W集?/p>
一个典型的环境
default_character_set
?utf8
。于是问题出CQ?/p>
character_set_client
?character_set_connection
都是 latin1Q此时怪异的事情发生了Q实际上?utf-8 格式的数据,被“当?latin1”{换成……居然还是{换成 latin1Q然后再p?latin1 转换?utf-8Q这么两ơ{换,有一部分 utf-8 的字W就丢失了,变成 ??Q最后输出的时?character_set_results
默认?latin1Q也pZؓ奇怪的东西了?/li>
如何解决问题
SET NAMES 'utf8'
Q没错,q是解决ҎQ但本文的目的是说明Q这Z么是解决Ҏ?/p>
default_character_set
?utf8Q数据表默认采用的就?utf-8 建立的。这也应该是所有采?MySQL 4.1 的主机提供商应该采用的配|。所以我们要保证的只是客L?MySQL 交互之间指定~码的正?/p>
SET character_set_client='gb2312'
SET character_set_connection='utf8' 或?
SET character_set_connection='gb2312'
SET character_set_results='gb2312'
SET character_set_client='utf8'
SET character_set_connection='utf8'
SET character_set_results='utf8'
SET NAMES 'utf8'
?/p>
WP 应该作什么修?/h3>
SET...
l?MySQL 的。怎么发送最合适呢Q台湄 pLog 同仁l出了一?a >Q?/p>
$dbEncoding
)Q?/li>
SET NAMES $dbEncoding
bloginfo('charset')
)Q但q个值是要连接数据库以后才能得到的,所以效率最高的方式是连接数据库之后Q根据这个配|设|一?SET NAMES
Q而不必每ơ查询之前都讄一遍?/p>
wp_includes/wp-db.php
中增?
function set_charset($charset)
{
// check mysql version first.
$serverVersion = mysql_get_server_info($this->dbh);
$version = explode('.', $serverVersion);
if ($version[0] < 4) return;
// check if utf8 support was compiled in
$result = mysql_query("SHOW CHARACTER SET like 'utf8'",
$this->dbh);
if (mysql_num_rows($result) < = 0) return;
if ($charset == 'utf-8' || $charset == 'UTF-8')
$charset = 'utf8';
@mysql_query("SET NAMES '$charset'", $this->dbh);
}
wp-settings.php
?require (ABSPATH . WPINC . '/vars.php');
后增?
$wpdb->set_charset(get_bloginfo('charset'));
]]>
1Q?MySQLimport的语法介l:
参数以及大量的选项可供选择。这个工h一个文本文Ӟtext
fileQ导入到你指定的数据库和表中。比方说我们要从文gCustomers.txt中把数据导入到数据库Meet_A_Geek中的?br />Custermers中:
,告诉操作pȝ你要q行的命令是MySQL/bin目录下的MySQLimportQ选项p是要求输入密码,q样p求你在改动数据库之前输入密码Q操?br />h会更安全。我们用了r选项是因为我们想要把表中的唯一关键字与文g记录中有重复唯一关键字的记录替换成文件中的数据。我们表单中的数据不是最新的Q需
要用文g中的数据L斎ͼ因而就用rq个选项Q替代数据库中已l有的记录。l选项的作用是在我们插入数据的时候锁住表Q这样就L了用户在我们更新表的?br />候对表进行查询或者更改的操作?/p>
log和MySQL的批处理Ҏ,来快速且方便地导入您地数据。当Ӟq样qM打字的麻烦?/p>
MySQLimport工具。尽如此,我们仍然可以使用LOAD DATA
INFILEQ下面的例子昄了如何向指定的栏?field)中导入数据:
出数据。一个重要的原因是用于备份数据库。数据的造h常常是昂늚Q需要}慎处理它们。经常地备䆾可以帮助防止宝贵数据C失;另外一个原因是Q也许您?br />望导出数据来׃n?在这个信息技术不断成长的世界中,׃n数据变得来常见?/p>
USAl护护着一个将要出版的书籍的大型数据库。这个数据库在许多书店之间共享,q样他们q道哪些书会很快出版。医院越来越走向采用无纸病历记录Q这
栯些病历可以随时跟着你。世界变得越来越,信息也被׃n得越来越多。有很多中导出数据得ҎQ它们都跟导入数据很怼。因为,毕竟Q这些都只是一U?br />视得方式。从数据库导出的数据是从另一端导入的数据。这里我们ƈ不讨论其他的数据库各U各L导出数据的方法,您将学会如何用MySQL来实现数据导
出?
q个选项会创徏两个文gQ一个文件包含DDL语句或者表创徏语句Q另一个文件包含数据。DDL文g被命名ؓtable_name.sql,数据文g被命
名ؓtable_name.txt.路径名是存放q两个文件的目录。目录必dl存在,q且命o的用者有Ҏ件的Ҏ?/p>
INFILE命o有相反作用的命oQ这是SELECT INTO OUTFILE
命oQ这两个命o有很多的怼之处。首先,它们有所有的选项几乎相同。现在您需要完成前面用MySQLdump完成的功能,可以依照下面的步骤进行操作:
]]>
建立链接前要先有到远E数据库的命名服务(q接字符ԌQ就是tnsnames.ora中描q的那个Q如'oradxp'
先测试一下:$tnsping oradxp
Attemping to contact(...) OK(30毫秒).
说明对远E数据库oradxp可访问?br />
创徏数据库链接的语法为:
CREATE PUBLIC DATABASE LINK oradxp.cug.edu.cn USING 'oradxp';
其中 oradxp.cug.edu.cn 必须是远E数据库的全局?SID),'oradxp'是到远E的q接字符丌Ӏ远E数据库的全局名可以通过登陆q程机,
SELECT * FROM global_name;
得到?br />
现在你就可以用链接oradxp.cug.edu.cn讉Kq程数据库了
?br /> SELECT * FROM global_name@oradxp.cug.edu.cn;
看看得到的是不是q程机的全局名?br /> 所有SELECT 语句后面跟上链接名都是对q程机的讉K?br />
注意Q登陆名口o是当前登陆本机的用户名和口令。也是如果你用的是public链接Q那么在q程p有一个和本机相同的用?口o才行。如Q你以aaa/aaad本机Q然后执?br /> SELECT * FROM BBB.bbb@oradxp.cug.edu.cn;
那么对远E数据BBB.bbb的访问用户ؓaaa口o为aaa
也就是在本机和远E机上都有用户aaa口o都ؓaaa才能执行成功Q?br />
关于U有链接Q?br /> CREATE DATABASE LINK oradxp.cug.edu.cn CONNECT TO system IDENTIFIED BY aaa;
q就建立了system的私有链接?br /> U有链接和public链接的差别就是登录名口o的限制。也是
你不用什么用L录本机,执行
SELECT * FROM BBB.bbb@oradxp.cug.edu.cn;
讉Kq程机数据BBB.bbb的用户和口o都ؓsystem/aaa
建好的数据链接放在系l表SYS.link$表中
通过OEM控制台的 分布-〉数据库链接可以查看所有的链接?br />
要删除public link 可以
drop public database link linkname;
对于U有链接先以相应用户登陆Q如上述system/aaa
然后drop database link linkname;
当然Q直接删除SYS.link$表中的记录一样可行?img src ="http://www.aygfsteel.com/onlykeke/aggbug/65835.html" width = "1" height = "1" />
]]>
最q因看到论坛有h问vq方面的东西Q将自己的理解加上查阅相兌料整理如下,如果不全或不当的地方Q望指正q补全它?
数据库名(DB_NAME)、实例名(Instance_name)、以及操作系l环境变?ORACLE_SID)
在ORACLE7?数据库中只有数据库名(db_name)和数据库实例?instance_name)。在ORACLE8i?i中出C新的参数Q即数据库域?db_domain)、服务名(service_name)、以及操作系l环境变?ORACLE_SID)。这些都存在于同一个数据库中的标识Q用于区分不同数据库的参数?
一、什么是数据库名(db_name)
数据库名是用于区分数据的内部标识Q是以二q制方式存储于数据库控制文g中的参数Q在数据安装或创Z后将不得修改。数据库安装完成后,该参数被写入数据库参数文件pfile中,格式如下Q?
.........
db_name="orcl" #(不允怿?
db_domain=dbcenter.toys.com
instance_name=orcl
service_names=orcl.dbcenter.toys.com
control_file=(...............
.........
在每一个运行的ORACLE8i数据库中都有一个数据库?db_name),如果一个服务器E序中创Z两个数据库,则有两个数据库名。其控制参数据分属在不同的pfile中控制着相关的数据库?
二、什么是数据库实例名(instance_name)
数据库实例名则用于和操作pȝ之间的联p,用于对外部连接时使用。在操作pȝ中要取得与数据库之间的交互,必须使用数据库实例名。例如,要和某一个数据库serverq接Q就必须知道其数据库实例名,只知道数据库名是没有用的Q与数据库名不同Q在数据安装或创建数据库之后Q实例名可以被修攏V数据库安装完成后,该实例名被写入数据库参数文gpfile中,格式如下Q?
db_name="orcl" #(不允怿?
db_domain=dbcenter.toys.com
instance_name=orcl #(可以修改,可以与db_name相同也可不同)
service_names=orcl.dbcenter.toys.com
control_file=(...............
.........
数据库名与实例名之间的关pR?/p>
数据库名与实例名之间的关pM般是一一对应关系Q有一个数据库名就有一个实例名Q如果在一个服务器中创Z个数据库Q则有两个数据库名,两个数据库实例名Q用两个标识定一个数据库Q用户和实例相连接?
但在8i?i的ƈ行服务器l构中,数据库与实例之间不存在一一对应关系Q而是一对多关系Q一个数据库对应多个实例Q同一旉内用户只一个实例相联系Q当某一实例出现故障Q其它实例自动服务,以保证数据库安全q行?
三、操作系l环境变?ORACLE_SID)
在实际中Q对于数据库实例名的描述有时使用实例?instance_name)参数Q有时用ORACLE_SID参数。这两个都是数据库实例名Q它们有什么区别呢Q?l常弄)
(ORACLE_SID)
OS<----------------> ORACLE 数据?<--------(Instance_name(实例?)
上图表示实例名instance_name、ORACLE_SID与数据库及操作系l之间的关系Q虽然这里列出的两个参数都是数据库实例名Q但instance_name参数是ORACLE数据库的参数Q此参数可以在参数文件中查询刎ͼ而ORACLE_SID参数则是操作pȝ环境变量?
操作pȝ环境变量ORACLE_SID用于和操作系l交互。也是_在操作系l中要想得到实例名,必M用ORACLE_SID。此参数与ORACLE_BASE、ORACLE_HOME{用法相同。在数据库安装之后,ORACLE_SID被用于定义数据库参数文g的名U。如Q?ORACLE_BASE/admin/DB_NAME/pfile/init$ORACLE_SID.ora?/p>
定义Ҏ:
export ORACLE_SID=orcl
如果在同一服务器中创徏了多个数据库Q则必然同时存在多个数据库实?q时可以重复上述定义q程Q以选择不同实例?
q可以用
[oracle@Datacent]$.oraenv
来切换不同的ORACLE_SID来通过操作pȝ来启动不同的实例(instance) ?/p>
MySQL的官Ҏ册关于字W集的介l比较全面,可以通过
创徏q接时指?br />useUnicode true
characterEncoding UTF-8
characterSetResults UTF-8
q些选项Q配合数据库默认的字W集实现支持中文?/p>
因ؓ字符从浏览器发送时为编码后的普通iso-8859-1文本?br />l过PHP转换为gb2312或utf-8后再发送到数据库时如果再{换编码,
带来的性能费可想而知?/p>