[問題] 網頁用PHP程式輸入資料到MYSQL之後的轉碼問題

phpMyAdmin Running Discuss
關於 phpMyAdmin 架設使用操作討論,非本程式相關問題一律砍文!

版主: 版主管理群

回覆文章
[瓊斯]
星球普通子民
星球普通子民
文章: 9
註冊時間: 2006-05-16 10:20

[問題] 網頁用PHP程式輸入資料到MYSQL之後的轉碼問題

文章 [瓊斯] »

因為我正在幫工會架立一個ROSTER系統的資料
可是我在網頁上面輸入的資料是UTF-8
網頁也是UTF-8 但是資料INPUT到SQL以後用
PHPADMIN查詢卻是ITALI1? O.o(我恨死義大利人了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)
我有爬文用過很多種改法 改到最接近的是可以顯示欄位的資料
可是.......我的其他資料庫卻變成亂碼.....
能不能讓他INPUT的時候就是UTF-8而不是ITALI1
這個問題跟我系統用來上傳工會成員資料的PHP有關嗎?
還是單純只是SQL跟PHPADMIN的設定問題
不好意思 拉拉雜雜寫了一堆 可能對問題敘述不是很清楚
因為我連很基本的程式語言都不是很懂一 一" 自學中
謝謝大大 教我問題大概出在哪嗎?

附上一些我覺得有問題地方的圖片
這是網頁資料的地方:正常
圖檔
這是SQL的畫面:亂碼
圖檔
這是SQL的組態設定
圖檔

安裝環境:
APPSERV Open Project - 2.5.5 for Windows
PHP 5.1.1
MYSQL 5.0.16
PHPADMIN 2.6.4-pl4
chiouss
竹貓忠實會員
竹貓忠實會員
文章: 1741
註冊時間: 2002-11-29 18:19

文章 chiouss »

站內搜尋 'SET NAMES utf8;'
[瓊斯]
星球普通子民
星球普通子民
文章: 9
註冊時間: 2006-05-16 10:20

文章 [瓊斯] »

這是我的MY.INI

#This File was made using the WinMySQLAdmin 1.3 Tool

#25/8/2003 8:50:22



#Uncomment or Add only the keys that you know how works.

#Read the MySQL Manual for instructions


[mysqld]
skip-locking
skip-innodb
set-variable = max_connections=16384
init_connect='SET NAMES utf8'
default-character-set=utf8
basedir=C:\AppServ/mysql
#bind-address=
datadir=C:\AppServ/mysql/data
#language=C:/AppServ/mysql/share/your language directory
#slow query log#=
#tmpdir#=
#port=3306
#set-variable=key_buffer=16M
[client]
default-character-set=utf8
[WinMySQLadmin]
user=******
password=******


有幾個變數我沒加進去 我去CH大的BLOG看過
回到正題,新的 MySQL 多了幾個環境變數來定義 charset,character_set_client, character_set_connection, character_set_database, character_set_results, character_set_server, character_set_system。MySQL 會把使用者的輸入做 character_set_client -> character_set_connection 的轉換 (把輸入的內容當成是 client 的編碼方式,然後轉換成 connection 的編碼),輸出則是依照 data 的 charset (MySQL 可以自訂各 table 的 charset 和 collation) 轉換成 character_set_result 來輸出。而一般我們加上
代碼:
SET NAMES utf8;

這段 (不管是直接加在 msql_connect 後面或是直接加在 my.ini 裡面) 為的是把 client, connection, result 這三個變數設定成 utf8,配合上原本的 UTF8 HTML 才會達到我們的目的,就是這麼一回事。為什麼要特別指定呢?因為不特別指定的話這幾個變數 default 值是 latin1,把 utf8 被當成 latin1 處理會把很多中文字給弄爛,所以網頁和 MySQL 要都設定成 utf8 才不會有問題出現。

是這幾個變數要給他設定嗎?
chiouss
竹貓忠實會員
竹貓忠實會員
文章: 1741
註冊時間: 2002-11-29 18:19

文章 chiouss »

[瓊斯] 寫:是這幾個變數要給他設定嗎?
[瓊斯]
星球普通子民
星球普通子民
文章: 9
註冊時間: 2006-05-16 10:20

文章 [瓊斯] »

[mysqld]
skip-locking
skip-innodb
set-variable = max_connections=16384
init_connect='SET NAMES utf8'
default-character-set=utf8
basedir=C:\AppServ/mysql
#bind-address=
datadir=C:\AppServ/mysql/data
#language=C:/AppServ/mysql/share/your language directory
#slow query log#=
#tmpdir#=
#port=3306
#set-variable=key_buffer=16M
[client]
default-character-set=utf8
[connection]
default-character-set=utf8
[result]
default-character-set=utf8

[WinMySQLadmin]
user=******
password=*******

沒有用呢......仍然還是ITALI 我恨義大利人!!!!
[瓊斯]
星球普通子民
星球普通子民
文章: 9
註冊時間: 2006-05-16 10:20

文章 [瓊斯] »

[mysqld]
skip-locking
skip-innodb
set-variable = max_connections=16384
init_connect='SET NAMES utf8'
default-character-set=utf8
basedir=C:\AppServ/mysql
#bind-address=
datadir=C:\AppServ/mysql/data
#language=C:/AppServ/mysql/share/your language directory
#slow query log#=
#tmpdir#=
#port=3306
#set-variable=key_buffer=16M
[client]
default-character-set=utf8
character_set_client=utf8
[connection]
default-character-set=utf8
character_set_connection=utf8
[result]
default-character-set=utf8
character_set_results=utf8

character_set_database=utf8
character_set_server=utf8
character_set_systemutf8


這樣寫也不行><"
chiouss
竹貓忠實會員
竹貓忠實會員
文章: 1741
註冊時間: 2002-11-29 18:19

文章 chiouss »

我上面哪有寫說是這樣改的? @.@
[瓊斯]
星球普通子民
星球普通子民
文章: 9
註冊時間: 2006-05-16 10:20

文章 [瓊斯] »

是要在當初建立資料表的SQL檔裡面就加進去嗎?
他的SQL檔如下
CREATE TABLE `roster_guild` (
`guild_id` int(11) unsigned NOT NULL auto_increment,
`guild_name` varchar(64) NOT NULL default '',
`server` varchar(32) NOT NULL default '',
`faction` varchar(8) NULL default NULL,
`guild_motd` varchar(255) NOT NULL default '',
`guild_num_members` int(11) NOT NULL default '0',
`update_time` datetime default NULL,
`guild_dateupdatedutc` varchar(18) default NULL,
`GPversion` varchar(6) NULL default NULL,
PRIMARY KEY (`guild_id`),
KEY `guild` (`guild_name`,`server`)
) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

我該把敘述放在哪呢?
[瓊斯]
星球普通子民
星球普通子民
文章: 9
註冊時間: 2006-05-16 10:20

文章 [瓊斯] »

還有他這個系統滿神奇的~"~
最近迷上PHP跟MYSQL自告奮勇的幫工會作了很多東西
我其他的資料庫都是UTF-8進 UTF-8儲存 UTF-8出 沒有問題

但是就只有這個系統 給我UTF-8進 ITALI-1儲存 UTF-8出.......
天阿~"~a 搞不懂.........
chiouss
竹貓忠實會員
竹貓忠實會員
文章: 1741
註冊時間: 2002-11-29 18:19

文章 chiouss »

我寫的東西你真的有看完嗎? Orz

代碼: 選擇全部

SET NAMES utf8;
這個 SQL 敘述如果要加在 PHP code 裡面的話請加在 mysql_connect 之後、query 之前。如果要放在 my.ini 裡面的話請放在 [mysqld] 裡面,用 init_connect 去跑。

還有問題的話建議你把站上的文章看仔細一點,很多篇都有說到這方面的問題。
[瓊斯]
星球普通子民
星球普通子民
文章: 9
註冊時間: 2006-05-16 10:20

文章 [瓊斯] »

[mysqld]
skip-locking
skip-innodb
set-variable = max_connections=16384
init_connect='SET NAMES utf8'

我有加阿......還是敘述方式不對呢?
我真的改了很多地方 像圖片第三張 原本不是UTF8
我不知道去哪亂亂改 改成都UTF8 可是依然沒有作用
可能我程度不太夠 網站上很多改的方法我都看不太懂
光是上面那個改法 您大概就知道了吧~"~a
不過如果真的懂的話 我就不會發問了QQ
請大大體諒
[瓊斯]
星球普通子民
星球普通子民
文章: 9
註冊時間: 2006-05-16 10:20

文章 [瓊斯] »

我改過了......
connect.client.result.system.database.server
都沒用阿~"~ 我還找了DOS底下的指令去查詢狀態
如圖
圖檔
chiouss
竹貓忠實會員
竹貓忠實會員
文章: 1741
註冊時間: 2002-11-29 18:19

文章 chiouss »

[瓊斯] 寫:init_connect='SET NAMES utf8'

我有加阿......還是敘述方式不對呢?
呃...尾巴要有 ; 阿!

還有,我應該有說過,如果你是用 root 去執行 php 的話,init_connect 是沒用的,請加在 php 裡面。
[瓊斯]
星球普通子民
星球普通子民
文章: 9
註冊時間: 2006-05-16 10:20

文章 [瓊斯] »

謝謝大大的回覆
我自己也跑去ROSTER系統的那個討論區
找到一些東西
好像是說MYSQL太聰明 把原本他們系統出來的資料給轉碼的樣子@@"
以下是原文:
** This problem/solution applies to all versions of Roster **
Roster 1.6.0 might work without this fix, it depends on the server

MySQL 5.0 supports strict tables, which causes known issues with WowRoster. And because of the impact of the fixes, it might be some time before it all gets ironed out.

But, the MySQL team was smart, and made it so you can disable that feature!

In the MySQL installation directory is a file, my.ini

In this file, you'll find the following lines:
# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

Remove the STRICT_TRANS_TABLES
from the list, and restart your MySQL database.

Hope this helps!

這種改法對其他有同樣問題的人有效果嗎?
chiouss
竹貓忠實會員
竹貓忠實會員
文章: 1741
註冊時間: 2002-11-29 18:19

文章 chiouss »

我有說過阿!你都沒看清楚...
MySQL 會把使用者的輸入做 character_set_client -> character_set_connection 的轉換 (把輸入的內容當成是 client 的編碼方式,然後轉換成 connection 的編碼),輸出則是依照 data 的 charset (MySQL 可以自訂各 table 的 charset 和 collation) 轉換成 character_set_result 來輸出。
anyway, 怎樣改你高興就好。
回覆文章

回到「phpMyAdmin」