posts - 495,  comments - 11,  trackbacks - 0
           

          今天啟動Eclipse時,彈出錯誤提示:

          解決辦法:將Eclipse下的eclipse.ini文件做如下改動

          =>

          ?

          posted @ 2011-08-16 17:09 jadmin 閱讀(111) | 評論 (0)編輯 收藏

          1.對查詢進行優化,應盡量避免全表掃描,首先應考慮在 where 及 order by 涉及的列上建立索引。

          2.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:

            select id from t where num is null

            可以在num上設置默認值0,確保表中num列沒有null值,然后這樣查詢:

            select id from t where num=0

          3.應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。

          4.應盡量避免在 where 子句中使用 or 來連接條件,否則將導致引擎放棄使用索引而進行全表掃描,如:

            select id from t where num=10 or num=20

            可以這樣查詢:

            select id from t where num=10

            union all

            select id from t where num=20

          5.in 和 not in 也要慎用,否則會導致全表掃描,如:

            select id from t where num in(1,2,3)

            對于連續的數值,能用 between 就不要用 in 了:

            select id from t where num between 1 and 3

          6.下面的查詢也將導致全表掃描:

            select id from t where name like '%abc%'

            若要提高效率,可以考慮全文檢索。

          7.如果在 where 子句中使用參數,也會導致全表掃描。因為SQL只有在運行時才會解析局部變量,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然而,如果在編譯時建立訪問計劃,變量的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃描:

            select id from t where num=@num

            可以改為強制查詢使用索引:

            select id from t with(index(索引名)) where num=@num

          8.應盡量避免在 where 子句中對字段進行表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:

            select id from t where num/2=100

            應改為:

            select id from t where num=100*2

          9.應盡量避免在where子句中對字段進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:

            select id from t where substring(name,1,3)='abc'--name以abc開頭的id

            select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id

            應改為:

            select id from t where name like 'abc%'

            select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'

          10.不要在 where 子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。

          11.在使用索引字段作為條件時,如果該索引是復合索引,那么必須使用到該索引中的第一個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用,并且應盡可能的讓字段順序與索引順序相一致。

          12.不要寫一些沒有意義的查詢,如需要生成一個空表結構:

            select col1,col2 into #t from t where 1=0

            這類代碼不會返回任何結果集,但是會消耗系統資源的,應改成這樣:

            create table #t(...)

          13.很多時候用 exists 代替 in 是一個好的選擇:

            select num from a where num in(select num from b)

            用下面的語句替換:

            select num from a where exists(select 1 from b where num=a.num)

          14.并不是所有索引對查詢都有效,SQL是根據表中數據來進行查詢優化的,當索引列有大量數據重復時,SQL查詢可能不會去利用索引,如一表中有字段sex,male、female幾乎各一半,那么即使在sex上建了索引也對查詢效

          率起不了作用。

          15.索引并不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有必要。

          16.應盡可能的避免更新 clustered 索引數據列,因為 clustered 索引數據列的順序就是表記錄的物理存儲順序,一旦該列值改變將導致整個表記錄的順序的調整,會耗費相當大的資源。若應用系統需要頻繁更新 clustered 索引數據列,那么需要考慮是否應將該索引建為 clustered 索引。

          17.盡量使用數字型字段,若只含數值信息的字段盡量不要設計為字符型,這會降低查詢和連接的性能,并會增加存儲開銷。這是因為引擎在處理查詢和連接時會逐個比較字符串中每一個字符,而對于數字型而言只需要比較一次就夠了。

          18.盡可能的使用 varchar/nvarchar 代替 char/nchar ,因為首先變長字段存儲空間小,可以節省存儲空間,其次對于查詢來說,在一個相對較小的字段內搜索效率顯然要高些。

          19.任何地方都不要使用 select * from t ,用具體的字段列表代替“*”,不要返回用不到的任何字段。

          20.盡量使用表變量來代替臨時表。如果表變量包含大量數據,請注意索引非常有限(只有主鍵索引)。

          21.避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。

          22.臨時表并不是不可使用,適當地使用它們可以使某些例程更有效,例如,當需要重復引用大型表或常用表中的某個數據集時。但是,對于一次性事件,最好使用導出表。

          23.在新建臨時表時,如果一次性插入數據量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果數據量不大,為了緩和系統表的資源,應先create table,然后insert。

          24.如果使用到了臨時表,在存儲過程的最后務必將所有的臨時表顯式刪除,先 truncate table ,然后 drop table ,這樣可以避免系統表的較長時間鎖定。

          25.盡量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那么就應該考慮改寫。

          26.使用基于游標的方法或臨時表方法之前,應先尋找基于集的解決方案來解決問題,基于集的方法通常更有效。

          27.與臨時表一樣,游標并不是不可使用。對小型數據集使用 FAST_FORWARD 游標通常要優于其他逐行處理方法,尤其是在必須引用幾個表才能獲得所需的數據時。在結果集中包括“合計”的例程通常要比使用游標執行的速度快。如果開發時間允許,基于游標的方法和基于集的方法都可以嘗試一下,看哪一種方法的效果更好。

          28.在所有的存儲過程和觸發器的開始處設置 SET NOCOUNT ON ,在結束時設置 SET NOCOUNT OFF 。無需在執行存儲過程和觸發器的每個語句后向客戶端發送 DONE_IN_PROC 消息。

          29.盡量避免大事務操作,提高系統并發能力。

          30.盡量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理。


          > sql優化方法

          1、使用索引來更快地遍歷表。

            缺省情況下建立的索引是非群集索引,但有時它并不是最佳的。在非群集索引下,數據在物理上隨機存放在數據頁上。合理的索引設計要建立在對各種查詢的分析和預測上。一般來說:

            a.有大量重復值、且經常有范圍查詢( > ,< ,> =,< =)和order by、group by發生的列,可考慮建立群集索引;

            b.經常同時存取多列,且每列都含有重復值可考慮建立組合索引;

            c.組合索引要盡量使關鍵查詢形成索引覆蓋,其前導列一定是使用最頻繁的列。索引雖有助于提高性能但不是索引越多越好,恰好相反過多的索引會導致系統低效。用戶在表中每加進一個索引,維護索引集合就要做相應的更新工作。

          2、在海量查詢時盡量少用格式轉換。

          3、ORDER BY和GROPU BY:使用ORDER BY和GROUP BY短語,任何一種索引都有助于SELECT的性能提高。

          4、任何對列的操作都將導致表掃描,它包括數據庫教程函數、計算表達式等等,查詢時要盡可能將操作移至等號右邊。

          5、IN、OR子句常會使用工作表,使索引失效。如果不產生大量重復值,可以考慮把子句拆開。拆開的子句中應該包含索引。

          6、只要能滿足你的需求,應盡可能使用更小的數據類型:例如使用MEDIUMINT代替INT

          7、盡量把所有的列設置為NOT NULL,如果你要保存NULL,手動去設置它,而不是把它設為默認值。

          8、盡量少用VARCHAR、TEXT、BLOB類型

          9、如果你的數據只有你所知的少量的幾個。最好使用ENUM類型

          10、正如graymice所講的那樣,建立索引。

          ?

          posted @ 2011-08-13 15:50 jadmin 閱讀(122) | 評論 (0)編輯 收藏

          SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

          LIMIT子句可以被用于強制SELECT語句返回指定的記錄數。LIMIT接受一個或兩個數字參數,參數必須是一個整數常量。
          如果給定兩個參數,第一個參數指定第一個返回記錄行的偏移量,第二個參數指定返回記錄行的最大數目。
          初始記錄行的偏移量是0(而不是1):為了與 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。

          mysql> SELECT * FROM table LIMIT 5, 10;? // 檢索記錄行 6-15

          //為了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個參數為 -1:
          mysql> SELECT * FROM table LIMIT 95, -1; // 檢索記錄行 96-last.

          //如果只給定一個參數,它表示返回最大的記錄行數目:
          mysql> SELECT * FROM table LIMIT 5;????? //檢索前 5 個記錄行

          //換句話說,LIMIT n 等價于 LIMIT 0,n。

          sql-1.
          SELECT * FROM table WHERE id >= (
          ??? SELECT MAX(id) FROM (
          ?????? SELECT id FROM table ORDER BY id limit 90001
          ??? ) AS tmp
          ) limit 100;

          sql-2.
          SELECT * FROM table WHERE id >= (
          ??? SELECT MAX(id) FROM (
          ?????? SELECT id FROM table ORDER BY id limit 90000, 1
          ??? ) AS tmp
          ) limit 100;

          同樣是取90000條后100條記錄,第1句快還是第2句快?
          第1句是先取了前90001條記錄,取其中最大一個id值作為起始標識,然后利用它可以快速定位下100條記錄
          第2句擇是僅僅取90000條記錄后1條,然后取id值作起始標識定位下100條記錄
          第1句執行結果.100 rows in set (0.23) sec
          第2句執行結果.100 rows in set (0.19) sec

          很明顯第2句勝出.看來limit好像并不完全像我之前想象的那樣做全表掃描返回limit offset+length條記錄,
          這樣看來limit比起MS-SQL的Top性能還是要提高不少的.

          其實sql-2完全可以簡化成:

          SELECT * FROM table WHERE id >= (
          ??? SELECT id FROM table limit 90000, 1
          ) limit 100;

          直接利用第90000條記錄的id,不用經過MAX函數運算,這樣做理論上效率因該高一些,但在實際使用中幾乎看不到效果,
          因為本身定位id返回的就是1條記錄,MAX幾乎不用運作就能得到結果,但這樣寫更清淅明朗,省去了畫蛇那一足.

          可是,既然MySQL有limit可以直接控制取出記錄的位置,為什么不干脆用SELECT id FROM table limit 90000, 1呢?豈不更簡潔?

          ?

          posted @ 2011-08-13 15:47 jadmin 閱讀(121) | 評論 (0)編輯 收藏

          tmp_table_size = 500mb //臨時表大小設置

          //指定用于索引的緩沖區大小,增加它可得到更好的索引處理性能。
          //對于內存在4GB左右的服務器該參數可設置為256M或384M。
          //注意:該參數值設置的過大反而會是服務器整體效率降低!
          key_buffer_size = 384m

          sort_buffer_size = 17mb //排序緩存

          read_buffer_size=4m //讀取緩存

          table_cache=256 //表緩存

          ft_min_word_len //全文搜索

          query_cache_size 查詢緩存

          <?
          #!/bin/sh
          #######檢查mysql狀態
          PORT=`netstat -na | grep "LISTEN" | grep "3306" | awk '{print $4}' | awk -F. '{print $2}'`
          if [ "$PORT" -eq "3306" ]
          ??????? then
          #######檢查mysql占CPU負載
          ??????? mysql_cpu=`top -U root -b -n 1 | grep mysql | awk '{print $10}'|awk -F. '{print $1}'`
          ##如果mysql cpu負載大于80,則重啟mysql
          ??????? if [ "$mysql_cpu" -ge "80" ]
          ??????????????? then
          ??????????????? ps xww |grep 'bin/mysqld_safe' |grep -v grep | awk '{print $1}' | xargs kill -9
          ??????????????? ps xww |grep 'libexec/mysqld' |grep -v grep | awk '{print $1}' | xargs kill -9
          ??????????????? sleep 5
          ??????????????? /usr/local/mysql/bin/mysqld_safe --user=root > /dev/null &
          ??????? else
          ??????????????? exit 0
          ??????? fi
          else
          ???????? /usr/local/mysql/bin/mysqld_safe --user=root > /dev/null &
          fi
          ?>

          影響列數: 4999 (查詢花費 0.1756 秒)
          UPDATE `jobs_faces` SET postime = '1250784000' WHERE jid <505000 AND jid >500000

          jobs_faces字段
          字段 類型 整理 屬性 Null 默認 額外 操作
          jid int(10)?? UNSIGNED 否? auto_increment??????????????
          oid int(10)?? UNSIGNED 否 0???????????????
          cid mediumint(8)?? UNSIGNED 否 0???????????????
          requests smallint(4)?? UNSIGNED 否 0???????????????
          views mediumint(6)?? UNSIGNED 是 0???????????????
          checked tinyint(1)?? UNSIGNED 否 0???????????????
          istoped tinyint(1)?? UNSIGNED 否 0???????????????
          postime int(10)?? UNSIGNED 否 0???????????????
          losetime int(10)?? UNSIGNED 否 0???????????????
          toped tinyint(1)?? UNSIGNED 否 0???????????????
          toptime int(10)?? UNSIGNED 否 0???????????????
          bold tinyint(1)?? UNSIGNED 否 0???????????????
          highlight varchar(7) gbk_chinese_ci? 否????????????????
          lightime int(10)?? UNSIGNED 否 0???????????????
          people smallint(4)?? UNSIGNED 否 0???????????????
          sex tinyint(1)?? UNSIGNED 否 0???????????????
          djobskinds varchar(30) gbk_chinese_ci? 否????????????????
          jname varchar(60) gbk_chinese_ci? 否

          影響列數: 4999 (查詢花費 0.2393 秒)
          UPDATE `jobs_faces` SET postime = '1250784000' WHERE jid <455000 AND jid >450000

          posted @ 2011-08-13 15:45 jadmin 閱讀(123) | 評論 (0)編輯 收藏

          注意:要把php.ini中 extension=php_mbstring.dll 前的;號去掉,重啟apache就可以了。
          我創建三個文件:text1.txt?? text2.txt?? text3.txt
          分別以ASCII? UTF-8? UNICODE 的編碼方式保存

          ?

          <?php
          define ('UTF32_BIG_ENDIAN_BOM',? chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF));
          define ('UTF32_LITTLE_ENDIAN_BOM',? chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00));
          define ('UTF16_BIG_ENDIAN_BOM',? chr(0xFE) . chr(0xFF));
          define ('UTF16_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE));
          define ('UTF8_BOM',? chr(0xEF) . chr(0xBB) . chr(0xBF));

          function detect_utf_encoding($text) {
          ??? $first2 = substr($text, 0, 2);
          ??? $first3 = substr($text, 0, 3);
          ??? $first4 = substr($text, 0, 3);
          ? ?
          ??? if ($first3 == UTF8_BOM) return 'UTF-8';
          ??? elseif ($first4 == UTF32_BIG_ENDIAN_BOM) return 'UTF-32BE';
          ??? elseif ($first4 == UTF32_LITTLE_ENDIAN_BOM) return 'UTF-32LE';
          ??? elseif ($first2 == UTF16_BIG_ENDIAN_BOM) return 'UTF-16BE';
          ??? elseif ($first2 == UTF16_LITTLE_ENDIAN_BOM) return 'UTF-16LE';
          }

          function getFileEncoding($str){
          ??? $encoding=mb_detect_encoding($str);
          ??? if(empty($encoding)){
          ??????? $encoding=detect_utf_encoding($str);
          ??? }
          ??? return $encoding;
          }

          $file = 'text1.txt';
          echo getFileEncoding(file_get_contents($file));? // 輸出ASCII
          echo '<br />';

          $file = 'text2.txt';
          echo getFileEncoding(file_get_contents($file));? // 輸出UTF-8
          echo '<br />';


          $file = 'text3.txt';
          echo getFileEncoding(file_get_contents($file));? // 輸出UTF-16LE
          echo '<br />';
          ?>


          posted @ 2011-08-12 20:16 jadmin 閱讀(169) | 評論 (0)編輯 收藏

          1. 下載PostgreSQL數據庫zip版本

          2.? 解壓到D盤,例如:D:\database\postgresql

          3.? cmd窗口進入D:\database\postgresq\bin,依次執行如下命令:
          set PGHOME=D:\database\postgresq
          set PGDATA=%PGHOME%\data
          set PGLIB=%PGHOME%\lib
          set PGHOST=localhost
          set PATH=%PGHOME%\bin;%PATH%

          4.? 添加用戶

          > 添加windows用戶,用于啟動PostgreSQL的windows服務

          D:\database\postgresql>net user postgres pgsqlpw /add /expires:never /passwordchg:no

          > 為保證安全,此用戶不允許本地登錄
          D:\database\postgresql>net localgroup users postgres /del

          > 賦于windows用戶postgres訪問PostgreSQL安裝目錄的權限
          D:\database\postgresql>cacls . /T /E /P postgres:R

          5.? 初始化數據庫

          > 切換到windows用戶postgres的命令行環境
          D:\database\postgresql>runas /noprofile /env /user:postgres "cmd"

          > 初始化數據庫,若不使用-U admin,則數據庫里自動添加當前windows用戶(即postgres)為數據庫帳號
          D:\database\postgresql>bin\initdb -D "D:\database\postgresql\data" -E UTF-8? --locale=chs -A md5 -U admin -W



          6. 啟動PostgreSQL服務:
          pg_ctl -D?D:\database\postgresql\data -l? D:\database\postgresql\pglog.txt start



          7. 創建并連接數據庫:
          createdb test
          psql -h localhost -w -d test



          8. 關閉PostgreSQL服務:
          pg_ctl -D? D:\database\postgresql\data stop

          9. 注冊為Windows服務:

          > 注冊為windows服務,當前windows用戶(即postgres)將作為PostgreSQL服務的登錄用戶
          D:\pgsql>bin\pg_ctl register -N PostgreSQL? -D “D:\database\postgresql\data

          > 啟動PostgreSQL服務
          D:\pgsql> sc start PostgreSQL

          ?

          ?

          posted @ 2011-08-11 20:46 jadmin 閱讀(235) | 評論 (0)編輯 收藏

          postgres=# select uuid_generate_v1();
          uuid_generate_v1
          --------------------------------------
          86811bd4-22a5-11df-b00e-ebd863f5f8a7
          (1 row)

          postgres=# select uuid_generate_v4();
          uuid_generate_v4
          --------------------------------------
          5edbfcbb-1df8-48fa-853f-7917e4e346db
          (1 row)

          主要就是uuid_generate_v1和uuid_generate_v4,當然還有uuid_generate_v3和uuid_generate_v5。

          其他使用可以參見PostgreSQL官方文檔?http://www.postgresql.org/docs/8.3/static/uuid-ossp.html


          posted @ 2011-08-05 18:20 jadmin 閱讀(591) | 評論 (0)編輯 收藏

          > memcache介紹
          Memcached是一個高性能的分布式內存對象緩存系統,用于動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提供動態、數據庫驅動網站的速度。Memcached基于一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,并通過memcached協議與守護進程通信。但是它并不提供冗余(例如,復制其hashmap條目);當某個服務器S停止運行或崩潰了,所有存放在S上的鍵/值對都將丟失。


          Memcached官方:http://danga.com/memcached/

          > memcache下載安裝
          下載Windows的Server端,下載地址:http://code.jellycan.com/memcached/

          安裝Memcache Server(也可以不安裝直接啟動)
          1. 下載memcached的windows穩定版,解壓放某個盤下面,比如在c:\memcached
          2. 在CMD下輸入 "c:\memcached\memcached.exe -d install" 安裝.
          3. 再輸入:"c:\memcached\memcached.exe -d start" 啟動。NOTE: 以后memcached將作為windows的一個服務每次開機時自動啟動。這樣服務器端已經安裝完畢了。

          如果下載的是二進制的版本,直接運行就可以了,可以加上參數來加以設置。

          常用設置:
          -p <num>????????? 監聽的端口
          -l <ip_addr>????? 連接的IP地址, 默認是本機
          -d start????????? 啟動memcached服務
          -d restart??????? 重起memcached服務
          -d stop|shutdown? 關閉正在運行的memcached服務
          -d install??????? 安裝memcached服務
          -d uninstall????? 卸載memcached服務
          -u <username>???? 以<username>的身份運行 (僅在以root運行的時候有效)
          -m <num>????????? 最大內存使用,單位MB。默認64MB
          -M??????????????? 內存耗盡時返回錯誤,而不是刪除項
          -c <num>????????? 最大同時連接數,默認是1024
          -f <factor>?????? 塊大小增長因子,默認是1.25
          -n <bytes>??????? 最小分配空間,key+value+flags默認是48
          -h??????????????? 顯示幫助

          然后就可以用java的memcached客戶端來試一下了。

          posted @ 2011-08-01 10:41 jadmin 閱讀(101) | 評論 (0)編輯 收藏

          1 echo()
          可以同時輸出多個字符串,可以多個參數,并不需要圓括號,無返回值。

          2 print()
          只可以同時輸出一個字符串,一個參數,需要圓括號,有返回值,當其執行失敗時返flase .??? print 的用法和C語言很像,所以會對輸出內容里的%做特殊解釋。
          $a=print('hi');
          echo $a;
          //----------------------------
          hi 1?? //1是$a的值。
          //-----------------------------

          3 die();??// 和exit()區別。
          有兩個功能:先輸出內容,然后退出程序。(常用在鏈接服務器,數據庫)
          mysql_connect("locahost","root","root") or die("鏈接服務器失敗!");

          4 printf();??? //f指format格式化
          printf("參數1",參數2):
          參數1=按什么格式輸出;參數2=輸出的變量。
          (%s:按字符串;%d:按整型;%b:按二進制;%x:按16進制;%X:按16進制大寫輸出;%o:按八進制; %f:按浮點型)

          對于參數1,其格式如下:
          %[ 'padding_character][-][width][.precision]type

          說明:
          所有轉換都以%開頭,如果想打印一個%,則必須用“%%”;
          參數padding_character是可選的,用來填充變量直至指定的寬度,如:printf ("$%'a10.2f" , 43.2); //$aaaaa43.20,默認是填充一個空格,如果指定了一個空格或0就不需要使用“'”做為前綴。對于任何其它前綴則必須指定單引號。
          【-】是可選的,添加它則表明數據應該左對齊。而不是默認的右對齊,如上例加一個-則為:printf ("$%'a-10.2f" , 43.2); //$43.20aaaaa
          whidth 表示在這里為將被替換的變量留下多少空間(按字符計算)。如上例的10(包括小數點).
          precision則必須是一個小數點開始,表示小數位后面要顯示的位數。

          函數,返回輸出字符個數,把文字格式化以后輸出,如:

          printf ("$%01.2f" , 43.2); //$43.20

          $表示填充的字符

          0表示位數不夠在不影響原值的情況下補0
          1表示輸出的總寬度
          2表示小數位數,有四舍五入

          %f 是表示顯示為一個浮點數

          格式化命令及說明:

          %% 印出百分比符號,不轉換。
          %b 整數轉成二進位。
          %c 整數轉成對應的 ASCII 字符。 如:printf ("$%c" , 65); // 輸出:A
          %d 整數轉成十進位。 如:printf ("$%d" , 65.53); // 輸出:65
          %f 倍精確度數字轉成浮點數。
          %o 整數轉成八進位。
          %s 整數轉成字符串。
          %x 整數轉成小寫十六進位。
          %X 整數轉成大寫十六進位

          對于printf(),還可以使用帶序號并以$符號結束的參數方式來指定參數轉換的順序。如:
          printf ("the total is $%2$.2f and subtotal: %1$.2f" , 65.55,37.2); //the total is $37.20 and subtotal: 65.55
          如上:%2$.2f指定了使用第二個參數65.55,%1$.2f則指定用第一個參數37.20。

          ?? <?php
          ???? $num=100.001;
          ???? printf("%d",$num); //100
          ???? printf("%s",$num); //100.001
          ???? printf("%s---%d---%b---%x---%o---%f",$num,$num,$num,$num,$num,$num)
          ???? //100.001---100---1100100---64---144---1001.00100
          ???? printf("%.2f",$num); //100.00 (小數點保留2位)
          ???? printf("%.1f",$num); //100.0 (小數點保留1位)
          ???? printf("%`#10s",$num); // #10s
          ???? printf("%#10s",$num); //10s
          ?? ?>

          5 sprintf();
          此并不能直接輸出,先賦給一個變量,然后再輸出變量。
          <?php
          $num=100.001;
          $a=sprintf("%d",$num);
          echo $a; //100
          ?>

          6 print_r();
          功能:只用于輸出數組。
          $a = array (1, 2, array ("a", "b", "c"));
          print_r ($a);

          返回:
          Array ( [0] => 1 [1] => 2 [2] => Array ( [0] => a [1] => b [2] => c ) )

          7 var_dump();
          功能: 輸出變量的內容,類型或字符串的內容,類型,長度。常用來調試。
          <?php
          $a=100;
          var_dump($a); //int(100)

          $a=100.356;
          var_dump($a); //float(100.356)
          ?>

          8.var_export ();
          返回關于傳遞給該函數的變量的結構信息,它和 var_dump() 類似,不同的是其返回的表示是合法的 PHP 代碼。
          您可以通過將函數的第二個參數設置為 TRUE,從而返回變量的值。
          <?php
          $a = array (1, 2, array ("a", "b", "c"));
          var_export ($a);
          /* 輸出:
          array (
          0 => 1,
          1 => 2,
          2 =>
          array (
          ?? 0 => 'a',
          ?? 1 => 'b',
          ?? 2 => 'c',
          ),
          )
          */

          $b = 3.1;
          $v = var_export($b, TRUE);
          echo $v;
          /* 輸出:
          3.1
          */
          ?>

          posted @ 2011-07-26 10:09 jadmin 閱讀(81) | 評論 (0)編輯 收藏

          mb_convert_encoding這個函數是用來轉換編碼的。原來一直對程序編碼這一概念不理解,不過現在好像有點開竅了。
          不過英文一般不會存在編碼問題,只有中文數據才會有這個問題。比如你用Zend Studio或Editplus寫程序時,用的是gbk編碼,如果數據需要入數據庫,而數據庫的編碼為utf8時,這時就要把數據進行編碼轉換,不然進到數據庫就會變成亂碼。

          mb_convert_encoding的用法見官方:
          http://cn.php.net/manual/zh/function.mb-convert-encoding.php

          做一個GBK To UTF-8
          < ?php
          header("content-Type: text/html; charset=Utf-8");
          echo mb_convert_encoding("妳係我的友仔", "UTF-8", "GBK");
          ?>

          再來個GB2312 To Big5
          < ?php
          header("content-Type: text/html; charset=big5");
          echo mb_convert_encoding("你是我的朋友", "big5", "GB2312");
          ?>
          不過要使用上面的函數需要安裝但是需要先enable mbstring 擴展庫。

          PHP中的另外一個函數iconv也是用來轉換字符串編碼的,與上函數功能相似。

          下面還有一些詳細的例子:
          iconv — Convert string to requested character encoding
          (PHP 4 >= 4.0.5, PHP 5)
          mb_convert_encoding — Convert character encoding
          (PHP 4 >= 4.0.6, PHP 5)

          用法:
          string mb_convert_encoding ( string str, string to_encoding [, mixed from_encoding] )
          需要先enable mbstring 擴展庫,在 php.ini里將; extension=php_mbstring.dll 前面的 ; 去掉
          mb_convert_encoding 可以指定多種輸入編碼,它會根據內容自動識別,但是執行效率比iconv差太多;

          string iconv ( string in_charset, string out_charset, string str )
          注意:第二個參數,除了可以指定要轉化到的編碼以外,還可以增加兩個后綴://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 會自動將不能直接轉化的字符變成一個或多個近似的字符,//IGNORE 會忽略掉不能轉化的字符,而默認效果是從第一個非法字符截斷。
          Returns the converted string or FALSE on failure.

          使用:
          發現iconv在轉換字符”—”到gb2312時會出錯,如果沒有ignore參數,所有該字符后面的字符串都無法被保存。不管怎么樣,這個”—”都無法轉換成功,無法輸出。 另外mb_convert_encoding沒有這個bug.

          一般情況下用 iconv,只有當遇到無法確定原編碼是何種編碼,或者iconv轉化后無法正常顯示時才用mb_convert_encoding 函數.

          from_encoding is specified by character code name before conversion. it can be array or string - comma separated enumerated list. If it is not specified, the internal encoding will be used.
          /* Auto detect encoding from JIS, eucjp-win, sjis-win, then convert str to UCS-2LE */
          $str = mb_convert_encoding($str, “UCS-2LE”, “JIS, eucjp-win, sjis-win”);
          /* “auto” is expanded to “ASCII,JIS,UTF-8,EUC-JP,SJIS” */
          $str = mb_convert_encoding($str, “EUC-JP”, “auto”);

          例子:
          $content = iconv(”GBK”, “UTF-8″, $content);
          $content = mb_convert_encoding($content, “UTF-8″, “GBK”);

          posted @ 2011-07-23 13:01 jadmin 閱讀(103) | 評論 (0)編輯 收藏
          僅列出標題
          共50頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 仪陇县| 将乐县| 视频| 淮南市| 固镇县| 白沙| 闽清县| 犍为县| 荔波县| 石楼县| 同德县| 肇州县| 许昌县| 临夏县| 明水县| 仙居县| 监利县| 吉水县| 沙坪坝区| 枝江市| 东至县| 太康县| 贺州市| 建宁县| 文水县| 九龙坡区| 正阳县| 怀仁县| 钦州市| 临海市| 沙坪坝区| 土默特右旗| 洛宁县| 奈曼旗| 凌云县| 思南县| 澄江县| 长武县| 大厂| 特克斯县| 浙江省|