jokytam168
可愛的小學生

文章: 23
|
 |
« 於: 2005-02-16 16:59 » |
|
剛剛po了一次, 居然不見了...唉唉唉...再來一次 我遇到了一個問題, MySQL 4.1.x 會把某些不存在的中文字, 例如 宏碁的碁吃掉.. 描述一下我的環境︰ 作業系統 os: Fedora Core 3 資料庫版本: MySQL 4.1.9 MySQL 的 my.cnf 設法 [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock skip-innodb default-character-set=big5 [mysql.server] user=mysql basedir=/var/lib
[safe_mysqld] err-log=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
[client] default-character-set=big5
重複問題的方式︰(先進入 mysql 的 shell) mysql> create database joky; mysql> use joky mysql> create table jj (a varchar(255)); mysql> insert into jj values ('我是中文, 現在沒問題'); mysql> insert into jj values ('我是怪字後面全不見,宏碁的比賽很...'); 第二個 insert 在 『碁』後的東西會全部不見, 如果你不相信, 你還可以把他放到第一個字, 那會全部不見.. mysql> select * from jj; +-----------------------+ | a | +-----------------------+ | 我是中文, | 我是怪字後面全不見,宏 | +-----------------------+ 2 rows in set (0.00 sec)
這個看來發生的問題是, Big5 字區裡的七個擴充字, 可能都有問題吧 擴充字 Big5 碼 Unicode 碼 碁 0xF9D6 0x88CF 銹 0xF9D7 0x92B9 裏 0xF9D8 0x7CA7 墻 0xF9D9 0x58BB 恒 0xF9DA 0x6052 粧 0xF9DB 0x7881 嫺 0xF9DC 0x5AFA 不知道各位先進及前輩有沒有任何的解法, 我會把7個擴充字都測一測再來回覆一篇
|
|
|
|
|
已記錄
|
|
|
|
jokytam168
可愛的小學生

文章: 23
|
 |
« 回覆文章 #1 於: 2005-02-16 17:02 » |
|
經小弟的測試, 果然這7個字都完了
碁,銹,裏,墻,恒,粧,嫺 <= 都不行
不知道有沒有辦法自已擴充mysql的字元集呢....
|
|
|
|
|
已記錄
|
|
|
|
|
duan
|
 |
« 回覆文章 #2 於: 2005-02-16 17:47 » |
|
剛剛po了一次, 居然不見了...唉唉唉...再來一次 我遇到了一個問題, MySQL 4.1.x 會把某些不存在的中文字, 例如 宏碁的碁吃掉.. 描述一下我的環境︰ 作業系統 os: Fedora Core 3 資料庫版本: MySQL 4.1.9 MySQL 的 my.cnf 設法
可能是因為使用 utf 的關係, 弟的 mysql 編譯時有指定使用 big5, 沒有這方面的問題 (剛剛有測試過). 或許您找另一台機器重編 mysql , 並指定用 big5 試試看?  供您參考 
|
|
|
|
|
已記錄
|
|
|
|
|
TyroneYeh
|
 |
« 回覆文章 #3 於: 2005-02-16 18:00 » |
|
mysql 4.1 資料庫中的資料都是 utf 編碼, 那些字都可以裝進去唷 應該是你 Client 的問題, 您用什麼軟體去 Insert into 資料的呢? 如果是 SSH 登入的話一定不行!
試試 xSqlTools 去 insert 資料, 就知道不是 mysql 4.1 的問題囉!
|
|
|
|
|
已記錄
|
|
|
|
jokytam168
可愛的小學生

文章: 23
|
 |
« 回覆文章 #4 於: 2005-02-16 22:35 » |
|
謝謝二位的回答, 我把我升級的狀況也描述一下, 裝好 FC3 後, 直接對 MySQL 進行升級 第一步, 升到 4.0.0 rpm -ivh MySQL-bench-4.0.23-0.i386.rpm MySQL-client-4.0.23-0.i386.rpm MySQL-devel-4.0.23-0.i386.rpm MySQL-embedded-4.0.23-0.i386.rpm MySQL-server-4.0.23-0.i386.rpm MySQL-shared-4.0.23-0.i386.rpm MySQL-shared-compat-4.0.23-0.i386.rpm 第二步, 升到 4.1.1 rpm -ivh MySQL-bench-4.1.9-0.i386.rpm MySQL-client-4.1.9-0.i386.rpm MySQL-devel-4.1.9-0.i386.rpm MySQL-embedded-4.1.9-0.i386.rpm MySQL-server-4.1.9-0.i386.rpm MySQL-shared-4.1.9-0.i386.rpm MySQL-shared-compat-4.1.9-0.i386.rpm 升級完後,指定好my.cnf 的資料,然後把舊的資料庫倒進去 cat xxx.sql | mysql 我並不是用自行complie 的方式, 應該沒有編譯成 utf8 的問題 至於我把資料丟進去的方法, 一個是用 php 來 insert 另一個是如同版主所說, 例用ssh (sshClient 3.2)的連線後, 來進行 insert 我把我連線 mysql 後的狀態貼出來 mysql Ver 14.7 Distrib 4.1.9, for pc-linux-gnu (i686)
Connection id: 876 Current database: joky Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 4.1.9-standard Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: big5 Db characterset: big5 Client characterset: big5 Conn. characterset: big5 UNIX socket: /var/lib/mysql/mysql.sock Uptime: 5 hours 52 min 19 sec
至於 mysql 裡頭內存是utf8的方法, 是我要把 server characterset 改為 utf8 嗎?麻煩請版主指點!
|
|
|
|
|
已記錄
|
|
|
|
jokytam168
可愛的小學生

文章: 23
|
 |
« 回覆文章 #5 於: 2005-02-16 22:50 » |
|
使用 xsql tools 的結果
insert into jj values ('我是中文, 現在沒問題'); insert into jj values ('我是怪字後面全不見,宏碁的比賽很...');
二行字數看起來全進去了,沒有發生從碁之後的字不見的情形, 但是 一旦我 select * from jj; 得到的都是亂碼, 我有試著在 資料庫設定中, 將 mysql 的編碼一次設為 utf8, 一次設為 big5, 一次設為空白, 三次設定完成後, 我都有把 xsql tools 關閉, 然後重新連線, 但是三次的結果都是亂碼, 還要請版主指點!
|
|
|
|
|
已記錄
|
|
|
|
|
TyroneYeh
|
 |
« 回覆文章 #6 於: 2005-02-17 00:11 » |
|
你下 show variables like 'character%' 就可以知道 MySQL System 系統部分是用什麼編碼了
mysql> show variables like 'character%'; +--------------------------+--------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------+ | character_set_client | big5 | | character_set_connection | big5 | | character_set_database | big5 | | character_set_results | big5 | | character_set_server | big5 | | character_set_system | utf8 | | character_sets_dir | /var/lib/mysql/mysql/charsets/ | +--------------------------+--------------------------------+ 7 rows in set (0.00 sec)
改 xSqlTools 編碼時有重新 insert 資料嗎? 你試著把設定編碼部份保留空白再 insert 一次資料看看
php 5.0.3 才支援 MySQL 4.1 版, 而且要重新 Complie PHP 讓它支援 MySQL 4.1 php 應該也能寫那些字, 只是他會變成&12345; 類似這種字元, 在瀏覽器上才看得出來什麼字(MySQL 用 big5 寫資料進去的話)
|
|
|
|
|
已記錄
|
|
|
|
|
|
jokytam168
可愛的小學生

文章: 23
|
 |
« 回覆文章 #8 於: 2005-02-17 13:01 » |
|
打太快了, 是用 -Uvh 啦.. :oops: 等一下來報告用 xsql tools 的結果
|
|
|
|
|
已記錄
|
|
|
|
jokytam168
可愛的小學生

文章: 23
|
 |
« 回覆文章 #9 於: 2005-02-17 23:29 » |
|
第一個方式, 使用PHP 來INSERT 資料過程︰ 先使用 http://phorum.study-area.org/viewtopic.php?t=29392 前輩所提的方法, 把資料存為 utf8 的 charset 然後使用 PHP 4.3.10 透過 mysql_pconnect , 並且先宣告語言 mysql_query("SET NAMES big5",$connect); mysql_query("SET CHARACTER_SET_CLIENT=big5",$connect); mysql_query("SET CHARACTER_SET_RESULTS=big5",$connect); =========================================== 結果, 中文字目前看來正常, 目前只有一個全形的.是轉壞的外, 其他正常 再來測試big5 裡的7個擴充字, 結果比原來的好, 字不會不見, 只是會變成亂碼 宏碁是不是一樣... > 會變成 > 宏?眲O不是一樣... 看來有點被吃掉, 所以影響到下一個字 =========================================== 第二,使用 xsql tools 來insert過程︰ 僅設立連線位置,保留編碼空白 =========================================== create table jj (a varchar(255)); select * from jj; 看來很完美, 不會再出現  的字 接下來 insert into jj values ('宏碁是不是一樣...'); select * from jj; 全部都是   .... =========================================== ok, 試著用另一種方式, drop table jj; create table jj (a varchar(255)) ENGINE=MyISAM DEFAULT CHARSET=utf8; 接下來 insert into jj values ('宏碁是不是一樣...'); select * from jj; 全部都是   .... =========================================== 不死心, 先 select * from jj; 然後用軟體裡提供的功能去更新 (有點像excel的地方) 還是  .. 接下來二個目標, 用新的 phpMyAdmin, 及 php 5 ...有結果會上來發表
|
|
|
|
|
已記錄
|
|
|
|
jokytam168
可愛的小學生

文章: 23
|
 |
« 回覆文章 #10 於: 2005-02-18 00:00 » |
|
以下為phpMyAdmin二種環境測試 環境一︰ Language 設為 zhtw-utf-8 , MySQL 文字編碼: UTF-8 Unicode (utf8) <- 這不能改, 應該跟db開的時候有關 MySQL 連線校對設為 utf8_unicode_ci 執行 insert into jj values ('宏碁是不是一樣...'); 然後 select * from jj; 結果很完美, 沒有任何亂碼 環境二︰ Language 設為 zhtw-utf-8 , MySQL 文字編碼: UTF-8 Unicode (utf8) <- 這不能改, 應該跟db開的時候有關 MySQL 連線校對設為 big5_chinese_ci 執行 insert into jj values ('2宏碁是不是一樣...'); 然後 select * from jj; 結果變成 2宏?是不是一樣...碁又不見了, 不過 phpMyAdmin 看來寫的比我自已寫的sql object好, 不知道是不是 addslashes 的影響, 他只有一個字不見, 我是後面的字也會受影響...... 現在剩 php 5 了... ============================ 其實之前都一直在用 postgresql, postgresql 本來就可以在 server 端存 utf8, 在php出來時用 big5 來顯示及 insert, 不過那時候沒有注意這7個字, 不知道會不會有問題
|
|
|
|
|
已記錄
|
|
|
|
jokytam168
可愛的小學生

文章: 23
|
 |
« 回覆文章 #11 於: 2005-02-18 01:25 » |
|
php5 的 configure ./configure --with-apache=../apache_1.3.33 --with-mysql=/usr --with-db --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --with-freetype-dir=/usr --with-ttf=/usr --enable-ftp --with-curl --with-openssl --enable-sockets --enable-track-vars --enable-memory-limit=yes --enable-debug=no --with-zlib --with-zlib-dir=/usr --with-iconv --enable-mbstring
基本上, 我的 mysql 是用 rpm 裝的, 所以只要下 --with-mysql=/usr 這樣就足夠了, 測試結果如下︰
使用 PHP 5.0.3 透過 mysql_pconnect , 並且先宣告語言 mysql_query("SET NAMES big5",$connect); mysql_query("SET CHARACTER_SET_CLIENT=big5",$connect); mysql_query("SET CHARACTER_SET_RESULTS=big5",$connect); =========================================== 測試big5 裡的7個擴充字, 結果跟原來在 php 4.3.10 一樣會變成亂碼 宏碁是不是一樣... > 會變成 > 宏?眲O不是一樣...
如果沒有猜錯, 應該是跟 php 本身的版本無關, 而是跟 insert 時有關, 還有mysql 在 big5 轉utf8 上是有bug的.. server端(utf8) => client (big5) => 特殊字塞回mysql時, db engine 沒有轉好
我正準備改寫我自已的 sql object, 看看是不是有幫助, 如果搞定再來回文
|
|
|
|
|
已記錄
|
|
|
|
|
TyroneYeh
|
 |
« 回覆文章 #12 於: 2005-02-18 08:35 » |
|
怪怪, 還是自己編譯的 MySQL 比較好的感覺, 因為都沒遇到你說的問題唷
|
|
|
|
|
已記錄
|
|
|
|
|
TyroneYeh
|
 |
« 回覆文章 #13 於: 2005-02-18 08:52 » |
|
好像是 MySQL 預設如果是 UTF8 才會正常, 剛剛試了一下 big5 的真的會被截掉 但是預設全是 UTF8 的則正常  
|
|
|
|
|
已記錄
|
|
|
|
jokytam168
可愛的小學生

文章: 23
|
 |
« 回覆文章 #14 於: 2005-02-18 10:52 » |
|
我來試試自已 complie mysql 是不是可以解決, 晚點回來貼測試結果
|
|
|
|
|
已記錄
|
|
|
|
|
Darkhero
|
 |
« 回覆文章 #15 於: 2005-02-18 15:33 » |
|
以下為phpMyAdmin二種環境測試 環境一︰ Language 設為 zhtw-utf-8 , MySQL 文字編碼: UTF-8 Unicode (utf8) <- 這不能改, 應該跟db開的時候有關 MySQL 連線校對設為 utf8_unicode_ci 執行 insert into jj values ('宏碁是不是一樣...'); 然後 select * from jj; 結果很完美, 沒有任何亂碼 關於這點... 根據我的使用,phpMyAdmin 2.6.1 後.似乎前台全面使用 utf8 進行頁面呈獻... 而從資料庫取出的資料則會經過 mysql client 跟 mysqld server 的比較後進行轉碼動作... 由於 phpMyAdmin 都是 utf8 了...所以在輸入的時候自然不會遇到 許功蓋 或是碁的問題...
|
|
|
|
|
已記錄
|
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯. 『灌水才是重點,發文只是順便』 『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
|
|
|
jokytam168
可愛的小學生

文章: 23
|
 |
« 回覆文章 #16 於: 2005-02-18 21:45 » |
|
用php實際上是可以把正確的字insert 到資料庫的, 如下︰ mysql_query("SET NAMES utf8",$connect); mysql_query("SET CHARACTER_SET_CLIENT=utf8",$connect); mysql_query("SET CHARACTER_SET_RESULTS=utf8",$connect); $query = iconv("big5","utf-8","insert into jj values ('宏碁是不是一樣...')"); mysql_query($query,$connect);
這樣塞回去, 在資料庫裡的字是正常的, 但是如果要再進行big5 的輸出 mysql_query("SET NAMES big5",$connect); mysql_query("SET CHARACTER_SET_CLIENT=big5",$connect); mysql_query("SET CHARACTER_SET_RESULTS=big5",$connect); mysql_query("select * from jj"); 那個『碁』還是會變成一個 ? 的字, 這點就不知道有沒有任何解法
我想應該要去 mysql 的 dev 裡發一個 bug 吧, 不知道大家有什麼意見呢 這應該算是轉碼的問題
|
|
|
|
|
已記錄
|
|
|
|
|
TyroneYeh
|
 |
« 回覆文章 #17 於: 2005-02-18 21:55 » |
|
我覺得這並不是 MySQL 的問題, 是中文有問題,怪字特別多 那 MySQL 都以支援 UTF8 了, 所以變成 ? 是 iconv 轉成 big5 的問題
如果捨棄 big5 全部使用 utf8 則無問題, 所以 4.1 版建議使用 utf8 來存取資料 網頁也可以使用, 再寫網頁時網頁的原始碼另存成 utf8 編碼, 這樣就沒有問題啦!
|
|
|
|
|
已記錄
|
|
|
|
jokytam168
可愛的小學生

文章: 23
|
 |
« 回覆文章 #18 於: 2005-02-18 23:14 » |
|
我覺得這是mysql 轉碼的問題, iconv 本身一切正常 假設把這段字放進去一個文字檔 query.txt 內容︰宏碁的比賽..................... 然後, iconv -c -f big5 -t utf-8 query.txt > query.utf8.txt 再來,把他轉回來, iconv -c -f utf-8 -t big5 query.utf8.txt > query.big5.txt 結果是 query.txt == query.big5.txt (碁一樣跑的出來) 所以我覺得應該是 mysql 在server端使用utf8轉big5時發生的 bug 因為 server 端的 utf8 是對的, 只是轉出來的 big5 遺缺了這7個沿伸字 所以我在 php 使用以下的方法讓他正確, mysql_query("SET NAMES utf8",$link); mysql_query("SET CHARACTER_SET_CLIENT=utf8",$link); mysql_query("SET CHARACTER_SET_RESULTS=utf8",$link); $query = "insert into jj values ('宏碁的比賽.....................')"; $query_utf8 = iconv("big5","utf-8",$query); mysql_query($query_utf8,$link); 再來是select 出來的時候, 每一個值都要轉回big5 $result = mysql_query("select * from jj",$link); for($i=0;$i<mysql_num_rows($result);$i++) { $tmp = mysql_fetch_array($result); while(list($k,$v)=each($tmp)) { echo iconv("utf-8","big5",$v)."<BR>"; } } 這樣轉回來的資料, 都是正確的, 也就是說, 『碁』就可以在網頁上出現了
|
|
|
|
|
已記錄
|
|
|
|
|
Darkhero
|
 |
« 回覆文章 #19 於: 2005-02-19 01:39 » |
|
的確是如此..剛剛我也去試了一下... 或許 mysql 的轉碼使用的並不是系統的 iconv ?... 而是有他自己的對應表..Q_Q..
或許 mysql 使用的是原始的 big5 對應...?
|
|
|
|
|
已記錄
|
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯. 『灌水才是重點,發文只是順便』 『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
|
|
|
|
|
|
kowala
|
 |
« 回覆文章 #21 於: 2005-02-19 17:18 » |
|
這的確是MySQL的問題,之前我用的時候(我是用JSP),也有這問題, 後來看大陸那邊的討論才知道是mysql不支援big5,它雖說有,其實沒有 但是unicode是有的,所以,為省麻煩,全部設成 UTF-8 ,就OK了。 使用UTF-8,還可以簡繁並列,多國並列,帥呆了。 see http://www.unicode.org/standard/WhatIsUnicode.html +---------+ +---------+ +---------+ | Broswer |<--|Connector|<--|DataBase | | UTF-8 |-->|utf8 |-->|utf8 | +---------+ +---------+ +---------+
補充一下,在mysql裡頭,需全部小寫,不可有"-" 如 utf8 這是我看它的 connectorJ Source code 裡頭是這樣宣告的...
|
|
|
|
|
已記錄
|
|
|
|
jokytam168
可愛的小學生

文章: 23
|
 |
« 回覆文章 #22 於: 2005-02-20 07:53 » |
|
我收到 MySQL dev 的回覆,原文如下 ======================== The problem that you are seeing could be caused by terminal that you are using.
Can you please send us the hex output from both INSERT and SELECT ??
You can use HEX() function for the purpose.
We do not see exactly , in hex, the exact string that is INSERTed and the exact string that is returned. ========================
不知道該如何回覆他呢, 我應該把我的資料如何給他呢
|
|
|
|
|
已記錄
|
|
|
|
|
TyroneYeh
|
 |
« 回覆文章 #23 於: 2005-02-20 08:37 » |
|
可以執行 SHOW CREATE TABLE jj; 看一下 CREATE TABLE `test` ( `ts_id` int(11) NOT NULL auto_increment, `ts_name` char(100) character set big5 default NULL, `ts_tel` char(50) default NULL, `ts_addr` char(50) default NULL, PRIMARY KEY (`ts_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8
我在 ts_name 如果欄位character 是 big5 的它就會塞進去的那幾個字就會變成 ? 但在 ts_tel 中一樣塞那些字就不會變成 ?, 就蠻正常的
|
|
|
|
|
已記錄
|
|
|
|
|
TyroneYeh
|
 |
« 回覆文章 #24 於: 2005-02-20 08:39 » |
|
我收到 MySQL dev 的回覆,原文如下 ======================== The problem that you are seeing could be caused by terminal that you are using.
Can you please send us the hex output from both INSERT and SELECT ??
You can use HEX() function for the purpose.
We do not see exactly , in hex, the exact string that is INSERTed and the exact string that is returned. ========================
不知道該如何回覆他呢, 我應該把我的資料如何給他呢 他好像是要用 hex function select 出來的東西吧! big5 hex 碁 E7A281 銹 E98AB9 裏 E8A38F 墻 E5A2BB 恒 E68192 粧 E7B2A7 嫺 E5ABBA
|
|
|
|
|
已記錄
|
|
|
|
|
TyroneYeh
|
 |
« 回覆文章 #25 於: 2005-03-11 01:41 » |
|
我覺得這是mysql 轉碼的問題, iconv 本身一切正常 怪怪, 怎麼我用 fedora core 3 的 iconv (glibc-common-2.3.4-2.fc3) 去轉換 碁字會消失不見 如果是 libiconv-1.9.1 的 iconv 就正常 PHP 的是用 libiconv-1.9.1 所以也正常
|
|
|
|
|
已記錄
|
|
|
|
cole945
可愛的小學生

文章: 2
|
 |
« 回覆文章 #26 於: 2005-03-24 14:14 » |
|
我character-set設成utf8反而有些字無法出現, 如:「碁」、「裏」、「恒」、「又」、「不」等字,但使用big5倒是可以正常show出 有人有類似的問題嗎?又該如何解決呢:3? -- 環境 FreeBSD 4.11 / WinXP sp2 apache-1.3.33 mysql-4.1.10a perl-5.8.6 php-5.0.3 +--------------------------+----------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | utf8 | | character_set_results | latin1 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/local/share/mysql/charsets/ | +--------------------------+----------------------------------+ 就算全設成 utf8問也仍然存在:3
|
|
|
|
|
已記錄
|
|
|
|
cole945
可愛的小學生

文章: 2
|
 |
« 回覆文章 #27 於: 2005-03-24 14:17 » |
|
哦,補充一下,我是在使用 wordpress 1.5 與 nucleus CMS 時發現這個問題的, 後來自己寫了一個perl的程式去insert/select資料,也是一樣的問題, 回到 WinXP 測問題仍存在,似乎是MySQL的問題:X
|
|
|
|
|
已記錄
|
|
|
|
Sasimicat
可愛的小學生

文章: 1
|
 |
« 回覆文章 #28 於: 2005-03-27 20:56 » |
|
|
|
|
|
|
已記錄
|
|
|
|
|
TyroneYeh
|
 |
« 回覆文章 #29 於: 2005-03-28 07:32 » |
|
癡癡的等囉...
|
|
|
|
|
已記錄
|
|
|
|
|