MySQL 語系設定會影響到瀏覽網頁時的預設編碼語系嗎?

edited 十月 2013 in 資料庫
關於 MySQL 的語系設定相對產生的影響有些疑惑還請各位前輩高手指點一下.

[問題]

請教一下為何我用瀏覽器讀網頁( big5 編碼存檔)時,
不論我在任何地方的任何電腦實測,當我點選工具列->檢視->編碼時,結果發現 browser 都是以 utf-8 在檢視網頁的...

ps1. 我有勾選 browser 的自動選取編碼功能

ps2. 且每個 page 都有這行設定: <meta http-equiv="Content-type" content="text/html" charset="big5" />
有了此行設定,照理 browser 不是應該預設自動應以 big5 來檢視網頁的嗎?(Q1)

ps3. 最下方是我的資料庫語系的全部相關設定,不知與這兒有無關係..


另外就是以我的例子與環境,
當 client-site user 在 form 表單填寫的資料被 post 回後端後,首先這些資料的編碼為何?(Q2)
然後當其被新增入 database 後又到底是以何種編碼存在資料庫中的呢?(Q3)


最後就是,
在這些以 BIG5 編碼存檔的網頁中若是有會從資料庫(UTF-8 見最下方 POST)調資料出來的話,是否會因與網頁上的其他資料有不同的編碼而在瀏覽時便成亂碼呢?(Q4)



[環境]

MySQL 設定:
=======================================
mysql> show variables;
'character_set_client', 'utf8'
'character_set_connection', 'utf8'
'character_set_database', 'utf8'
'character_set_results', 'utf8'
'character_set_server', 'utf8'
'character_set_system', 'utf8'

my.ini 檔案:
========================================
[mysqld]
init_connect='SET NAMES utf8'
default-character-set=utf8
default-collation=utf8_general_ci

[mysql]
default-character-set=utf8

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=1301

評論

  • edited 二月 2006
    那麼之所以造成強迫 client user's browser 以 utf-8 檢視網頁是以下
    哪些設定造成的?.(or 為其它因素,有人能明確指出來嗎?).....這是我最想弄清楚的#

    ==================================
    環境變數的
    'character_set_client', 'utf8'
    'character_set_connection', 'utf8'

    my.ini 的
    [mysql]
    default-character-set=utf8
    ==================================
  • edited 二月 2006
    其實我覺得...你該檢查一下 Apache 與 PHP 的設定。 :)
  • edited 二月 2006
    A1
    可以檢查一下apache的設定檔
    AddDefaultCharset
    這個地方是限定預設以哪種編碼傳給client端
    如果要強制傳遞成big5,可改成
    AddDefaultCharset Big5
    如果有下meta的習慣,可以把AddDefaultCharset mark掉
    這樣apache不會強制傳遞編碼,client會以meta的語系顯現

    A2-4
    這種情況非常複雜,發生這種狀況我只會想法子讓編碼一致而不是考慮這些
  • edited 二月 2006
    以下是我全部環境的設定,除了 MySQL 是 utf-8 外,其餘全部環境都是 big5, 所以才會有我開板標題的疑問.....

    httpd.conf
    =======
    DefaultLanguage zh-TW

    AddLanguage zh-TW .zh-tw

    LanguagePriority zh-TW

    AddDefaultCharset Big5

    AddCharset Big5 .Big5 .big5
    AddCharset big5 .big5 .b5



    php.ini
    =====
    ;default_charset = "iso-8859-1" -> 註解掉了



    網頁文件
    ======
    <meta http-equiv="Content-type" content="text/html" charset="big5" />



    MySQL 設定:
    ========
    mysql> show variables;
    'character_set_client', 'utf8'
    'character_set_connection', 'utf8'
    'character_set_database', 'utf8'
    'character_set_results', 'utf8'
    'character_set_server', 'utf8'
    'character_set_system', 'utf8'

    my.ini 檔案:
    ========
    [mysqld]
    init_connect='SET NAMES utf8'
    default-character-set=utf8
    default-collation=utf8_general_ci

    [mysql]
    default-character-set=utf8
  • edited 二月 2006
    以下這 6 項個別所針對的東西有人能明確指出嗎?
    [A]character_set_client
    character_set_connection
    [C]character_set_database
    [D]character_set_results
    [E]character_set_server
    [F]character_set_system

    EX:
    當 client-site user 在 form 表單填寫的資料被 post 回後端後,這些資料的編碼是哪一個所設定的?

    然後當其被新增入 database 後以特定編碼存在資料庫中的設定又是哪一個呢?

    [D] 是用來設定於 php file 中調出資料並印在網頁時的編碼嗎?
    還是以 command line 作查詢時所印出的查詢結果之編碼?

    [A] 與 有何不同?
    [C] 與 [E] 與 [F] 有何不同?
  • edited 二月 2006
    關於 MySQL 的字元設定也許這篇文章會比較容易理解(簡體):
    http://hanliu.kxup.com/archives/289-A-MySQL-4.1-Story.html

    瀏覽器自動判斷網頁的編碼應該有兩個途徑,一個是看 html 中的標示,也就是 meta 標籤中指定的項目;另一個則是 http header ,後者會比前者優先採納,而能夠影響 http header 的理論上只有 Apache 與 PHP ,因此如果設定中沒有發現問題,不妨看看有沒有 .htaccess 檔案作祟或是 PHP 的程式碼有沒有相關的參數或使用函數導致瀏覽器會判斷為 UTF-8 。
    當 client-site user 在 form 表單填寫的資料被 post 回後端後,首先這些資料的編碼為何?(Q2)

    基本上用戶端在提供資料時的字元格式會依照瀏覽器的設定,可能是自動判斷、也可能是用戶端自行選擇,更甚者有人會自己寫小程式亂送各國編碼來玩你的機器,所以用戶端提供的資料編碼為何不容易掌握。
    然後當其被新增入 database 後又到底是以何種編碼存在資料庫中的呢?(Q3)

    因為用戶端提供的資料不容易掌握,因此將資料直接放入資料庫是很危險的事情;除了避開一些危險的字元外,如果網站同時使用多國語系(例如簡繁共存),比較謹慎的作法是嘗試判斷字元的編碼,不過很少人會這麼謹慎,我就是很好的錯誤示範。 ^^||
    以 BIG5 編碼存檔的網頁中若是有會從資料庫(UTF-8 見最下方 POST)調資料出來的話,是否會因與網頁上的其他資料有不同的編碼而在瀏覽時便成亂碼呢?(Q4)

    會,在 PHP 中有 MBSTRING 函數可以設定為自動處理,但是過度依賴可能不是件好事情。
  • edited 二月 2006
    感謝.

    容我再確定一下:
    假設我包括 "伺服環境" 與 "網頁檔案存檔時之編碼選擇" 全都統一設成 utf-8 時,

    以最單純的情況來說,
    是否當 user 接收到網頁後並在表單填上的資料(含中,英,日...)就是會以 utf-8 為編碼 POST 回來呢?

    若是,
    那麼當 user 自行指定 Browser 的 檢視/編碼/繁體中文 的話,那麼其在表單填上的資料也就會以 big5 為編碼,
    如此 MySQL 在全部語系都設成 utf-8 下會發生什麼狀況嗎?...這些資料會原封不動地以 big5 的編碼樣貌存進資料庫中嗎?

    若是,
    那麼為預防此情形發生是否就得如您說的利用 php script 先行判斷字元的編碼再作存進資料庫的動作呢?
  • edited 三月 2006
    你說的都對。
  • edited 三月 2006
    原來這些 charset 變數是用來讓 mysql 判斷是否須作 "convert" 的動作.簡單的說就是 client to server 或 server to client 不同時就會自動轉換,所以在設這些變數時要小心,否則會讓 mysql 誤判.

    以下截自官網的資訊,
    source: http://dev.mysql.com/doc/refman/4.1/en/charset-connection.html
    What character set should the server translate a statement to after receiving it?

    For this, the server uses the character_set_connection and collation_connection system variables. It converts statements sent by the client from character_set_client to character_set_connection (except for string literals that have an introducer such as _latin1 or _utf8). collation_connection is important for comparisons of literal strings. For comparisons of strings with column values, collation_connection does not matter because columns have their own collation, which has a higher collation precedence.
    以上這段是何意義?(看的霧煞煞)


    character_set_client 設定了 mysql client 的 statements 編碼,
    那 character_set_connection 是代表什麼東東?(這點您給我的連結也說他不懂)

    還有原文意思似乎是當這兩個變數不同值時,mysql才會進行轉換(except for string literals that have an introducer such as _latin1 or _utf8 一句又是何意思??)

    那麼何種情況時,此二變數須設成不同編碼值呢?
  • edited 五月 2006
    [問題]

    請教一下為何我用瀏覽器讀網頁( big5 編碼存檔)時,
    不論我在任何地方的任何電腦實測,當我點選工具列->檢視->編碼時,結果發現 browser 都是以 utf-8 在檢視網頁的...

    我的看法和 網站管理員 相同
    可以把Apache Server的 AddDefaultCharset mark掉 這樣apache不會強制傳遞編碼

    若你不是租用 Web Hosting 時httpd.conf設定檔以自已操控, 在最前面加上 # ,這是httpd.conf的注釋標記
    修改前:
    AddDefaultCharset utf8
    加上 # 使它成為註解(沒有作用) 修改後:
    #AddDefaultCharset utf8

    还不清楚可以參考此的教學網頁http://seed100.com
  • edited 五月 2006
    假設我包括 "伺服環境" 與 "網頁檔案存檔時之編碼選擇" 全都統一設成 utf-8 時
    若是资料不多 用 Windows附的notepad 或UltraEdit 把资料改以 utf8格式編碼後Save As (儲存),再送進 MySQL 即可,资料很多 试试看PHP 手冊 mb-convert-encoding
    以上這段是何意義?(看的霧煞煞)


    character_set_client 設定了 mysql client 的 statements 編碼,
    那 character_set_connection 是代表什麼東東?(這點您給我的連結也說他不懂)

    還有原文意思似乎是當這兩個變數不同值時,mysql才會進行轉換(except for string literals that have an introducer such as _latin1 or _utf8 一句又是何意思??)
    What character set should the server translate a statement to after receiving it?
    服务器端在接收到了查询以后, 应该把翻译translate到什么字符集里?
    For this, the server uses the character_set_connection and collation_connection system variables. It converts statements sent by the client from character_set_client to character_set_connection (except for string literals that have an introducer such as _latin1 or _utf8).
    对于这个,服务器用的是character_set_connection 和 collation_connection 这两个变量variables。它把客户端送来的查询 从 character_set_client转换成 character_set_connection(除了latin1或者utf8 的字符串)


    造成乱码的问题很多 光看这些 MySQL 中文參考手冊的翻譯, 还不足以解决你的问题,既使看懂表面的翻譯,還是霧煞煞



    若要不亂碼 你最好把MySQL官網下面這些statements 設定研究清楚
    mysql> show variables;
    'character_set_client', 'utf8'
    'character_set_connection', 'utf8'
    'character_set_database', 'utf8'
    'character_set_results', 'utf8'
    'character_set_server', 'utf8'
    'character_set_system', 'utf8'

    尽可能多看例子說明 到此網站http://seed100.comMySQL 中文參考手冊 重點翻譯 例子說明
  • edited 六月 2006
    [瀏覽網頁是和HTTP server溝通~ 而不是MySQL]

    同意AddDefaultCharset的問題~
    畢竟是http header送出會有預設編碼代碼~
    then~ 應該也可以設定.htaccess達到預設編碼的目的
Sign In or Register to comment.