[問題] 網頁用PHP程式輸入資料到MYSQL之後的轉碼問題
版主: 版主管理群
[問題] 網頁用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
可是我在網頁上面輸入的資料是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
這是我的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 才不會有問題出現。
是這幾個變數要給他設定嗎?
#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 才不會有問題出現。
是這幾個變數要給他設定嗎?
[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 我恨義大利人!!!!
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 我恨義大利人!!!!
[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
這樣寫也不行><"
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
這樣寫也不行><"
是要在當初建立資料表的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;
我該把敘述放在哪呢?
他的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;
我該把敘述放在哪呢?
謝謝大大的回覆
我自己也跑去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!
這種改法對其他有同樣問題的人有效果嗎?
我自己也跑去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!
這種改法對其他有同樣問題的人有效果嗎?