作者 主題: [Help]MySQL 3.x 升級至 5.1.x 中文字認定不同?  (閱讀 15599 次)

0 會員 與 1 訪客 正在閱讀本文。

unitcell

  • 活潑的大學生
  • ***
  • 文章數: 411
    • 檢視個人資料
Hi all,

主要功能:select出兩個中文字.

原本在3.x版,是這樣做的,
代碼: [選擇]
select left(name,4) from xx;一個中文字被看成2個字元.

現在5.1.x版, 同上面做法, 確會秀出4個中文字.

如何保有原3.x版的做法呢?

Thanx.

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
Hi all,
主要功能:select出兩個中文字.
原本在3.x版,是這樣做的,
代碼: [選擇]
select left(name,4) from xx;一個中文字被看成2個字元.
現在5.1.x版, 同上面做法, 確會秀出4個中文字.
如何保有原3.x版的做法呢?
Thanx.

這邊回應可能無法提供你要的答案,不過回到問題面來看.... 我認為應該是你當初使用 mysql 3.x 時候沒去注意到預設字集設定引起的。

也就是你當初使用了 latin1 當作預設字集使用後所以一個中文被當作兩個英文字元,並且在 "將錯就錯" 環境使用得到的結果。而現在預設走用 utf8 且字集正確,所以就得到正確結果。
I am kenduest - 小州

my website: http://kenduest.sayya.org/

unitcell

  • 活潑的大學生
  • ***
  • 文章數: 411
    • 檢視個人資料
如此 感覺latin1較好用.

當下 select rpad(name,10,' ') into outfile '/tmp/tmp.txt' from xx;
轉出的效果, 絕對剛剛好10個字元, 即使是中英文.

當然了, 有些中文字就要犧牲秀不出的問題.

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1693
    • 檢視個人資料
如此 感覺latin1較好用.

當下 select rpad(name,10,' ') into outfile '/tmp/tmp.txt' from xx;
轉出的效果, 絕對剛剛好10個字元, 即使是中英文.

當然了, 有些中文字就要犧牲秀不出的問題.
加 where 就好了
CHAR_LENGTH(str)
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_char-length
基本上....還是建議用 5.x , 3.x 都不維護了,那天掛了找不到載點就orz

unitcell

  • 活潑的大學生
  • ***
  • 文章數: 411
    • 檢視個人資料
剛剛發現,

用C, 判斷 strlen("酷!學園"); 得到答案是7.
用Java, 判斷 "酷!學園".length(); 得到答案是4.

真的紛傷腦筋!

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5417
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
用C, 判斷 strlen("酷!學園"); 得到答案是7.
C 的一個 char 就是 1 byte, 標準的函式庫裡頭的函式都是不懂 multibyte 的字, 當然是直接算 byte.
用 C 一定是 7 嗎? 上頭的例子 big5 才會是 7 吧, 用 utf-8, 每個中文字的長度就會變成 3 了.

Java 是認得 multibyte 字元的, 所以不管一個中文實際佔幾個 byte, 都算一個字.

使用者本來就要知道你用的東西支不支援 multibyte.

unitcell

  • 活潑的大學生
  • ***
  • 文章數: 411
    • 檢視個人資料
習慣了某些動作或功能, 一時還真難改.
若是一大片山要改. 哇! 哭笑不得!

micmic3

  • 俺是博士!
  • *****
  • 文章數: 1693
    • 檢視個人資料
習慣了某些動作或功能, 一時還真難改.
若是一大片山要改. 哇! 哭笑不得!
用  db 的 CHAR_LENGTH(str)
出來應該是一樣的