酷!學園

技術討論區 => database 討論版 => 主題作者是: unitcell 於 2010-12-21 22:14

主題: [Help]MySQL 3.x 升級至 5.1.x 中文字認定不同?
作者: unitcell2010-12-21 22:14
Hi all,

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

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

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

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

Thanx.
主題: 回覆: [Help]MySQL 3.x 升級至 5.1.x 中文字認定不同?
作者: kenduest2010-12-21 22:50
Hi all,
主要功能:select出兩個中文字.
原本在3.x版,是這樣做的,
代碼: [選擇]
select left(name,4) from xx;一個中文字被看成2個字元.
現在5.1.x版, 同上面做法, 確會秀出4個中文字.
如何保有原3.x版的做法呢?
Thanx.

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

也就是你當初使用了 latin1 當作預設字集使用後所以一個中文被當作兩個英文字元,並且在 "將錯就錯" 環境使用得到的結果。而現在預設走用 utf8 且字集正確,所以就得到正確結果。
主題: 回覆: [Help]MySQL 3.x 升級至 5.1.x 中文字認定不同?
作者: unitcell2010-12-22 09:54
如此 感覺latin1較好用.

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

當然了, 有些中文字就要犧牲秀不出的問題.
主題: 回覆: [Help]MySQL 3.x 升級至 5.1.x 中文字認定不同?
作者: micmic32010-12-22 10:07
如此 感覺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 (http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_char-length)
基本上....還是建議用 5.x , 3.x 都不維護了,那天掛了找不到載點就orz
主題: 回覆: [Help]MySQL 3.x 升級至 5.1.x 中文字認定不同?
作者: unitcell2010-12-22 10:09
剛剛發現,

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

真的紛傷腦筋!
主題: 回覆: [Help]MySQL 3.x 升級至 5.1.x 中文字認定不同?
作者: twu22010-12-22 10:17
用C, 判斷 strlen("酷!學園"); 得到答案是7.
C 的一個 char 就是 1 byte, 標準的函式庫裡頭的函式都是不懂 multibyte 的字, 當然是直接算 byte.
用 C 一定是 7 嗎? 上頭的例子 big5 才會是 7 吧, 用 utf-8, 每個中文字的長度就會變成 3 了.

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

使用者本來就要知道你用的東西支不支援 multibyte.
主題: 回覆: [Help]MySQL 3.x 升級至 5.1.x 中文字認定不同?
作者: unitcell2010-12-22 21:46
習慣了某些動作或功能, 一時還真難改.
若是一大片山要改. 哇! 哭笑不得!
主題: 回覆: [Help]MySQL 3.x 升級至 5.1.x 中文字認定不同?
作者: micmic32010-12-23 14:23
習慣了某些動作或功能, 一時還真難改.
若是一大片山要改. 哇! 哭笑不得!
用  db 的 CHAR_LENGTH(str)
出來應該是一樣的