mysql關於字符集character set的總結

lusklusklusk發表於2018-10-13

總結

1、建立表和建立資料庫時都可以指定字符集

2、建立表沒有指定字符集則預設使用資料庫的字符集

3、資料庫的預設字符集存放在db.opt檔案中,create database時會自動生成此檔案,show create database時顯示db.opt檔案中的字符集,每個資料庫目錄下都有一個db.opt檔案

4、db.opt這個檔案丟失不影響資料庫執行,該檔案丟失之後新建表時,找不到資料庫的預設字符集,就把character_set_server當成資料庫的預設字符集,show create database時顯示character_set_server字符集

5、建立資料庫沒有指定字符集則預設使用character_set_server字符集,如果character_set_server沒有設定,則預設是latin1

6、字元序的命名,以其對應的字符集作為字首,比如字元序utf8_general_ci,標明它是字符集utf8的字元序,所以如果character_set_server變了,則collation_server也會變

7、如果要修改預設字符集,一般在my.cnf檔案裡設定character_set_server引數

8、如果改變預設字符集,原來存在的資料庫和表的字符集不變,db.opt存在的情況下新建的表不指定字符集還是使用原來資料庫的字符集即db.opt中的字符集,新建的資料庫如果不指定字符集則使用修改後的字符集。比如character_set_server為utf8,原來建庫testdb1不加字符集,在testdb1建立表tab1也不指定字符集,則testdb1和testdb1.tab1字符集都是utf8。修改character_set_server為utf16後,在testdb1上建裡表tab2不指定字符集,則testdb1.tab2字符集還是testdb1的字符集utf8,新建庫testdb2不指定字符集,則testdb2字符集是utf16

9、windows機器檢視字符集方法在cmd視窗輸入chcp即可,linux機器檢視字符集方法echo $LANG或locale

10、使用default-character-set值作為客戶端和連線的預設字符集,比如在A機器上字符集utf8和B機器上字符集latin1執行同一條SQL, A機器中文正常, B機器中文出現亂碼,這個跟客戶端的字符集有關係,此時可以在客戶端/etc/my.cnf的client中增加default-character-set=utf8或在服務端執行set global init_connect="SET NAMES utf8",使客戶端都使用utf8來連線資料庫服務端



https://dev.mysql.com/doc/refman/5.7/en/charset-general.html

A character set is a set of symbols and encodings. A collation is a set of rules for comparing characters in a character set. 

字符集是一組符號和編碼。 排序規則是用於比較字符集中的字元的一組規則。

字符集(Character set )

字元序(Collation)是指在同一字符集內字元之間的比較規則

1、一個字符集對應至少一種字元序(一般是1對多)

2、兩個不同的字符集不能有相同的字元序

3、每個字符集都有預設的字元序



檢視資料庫支援的字符集的方法

mysql> SHOW CHARACTER SET;

mysql> select * from information_schema.character_sets


檢視資料庫支援的字元序的方法

mysql> SHOW COLLATION;

mysql> select * from information_schema.COLLATIONS


mysql> show variables like '%charac%';

+--------------------------+----------------------------+

| Variable_name            | Value                      |

+--------------------------+----------------------------+

| character_set_client     | utf8                       |

| character_set_connection | utf8                       |

| character_set_database   | latin1                     |

| character_set_filesystem | binary                     |

| character_set_results    | utf8                       |

| character_set_server     | latin1                     |

| character_set_system     | utf8                       |

| character_sets_dir       | /usr/share/mysql/charsets/ |

+--------------------------+----------------------------+


mysql> show variables like '%colla%';

+----------------------+-------------------+

| Variable_name        | Value             |

+----------------------+-------------------+

| collation_connection | utf8_general_ci   |

| collation_database   | latin1_swedish_ci |

| collation_server     | latin1_swedish_ci |

+----------------------+-------------------+


character_set_database

The character set used by the default database. The server sets this variable whenever the default database changes. If there is no default database, the variable has the same value as character_set_server

The global character_set_database and collation_database system variables are deprecated in MySQL 5.7 and will be removed in a future version of MySQL.

預設資料庫使用的字符集。 每當預設資料庫更改時,伺服器都會設定此變數。 如果沒有預設資料庫,則該變數與character_set_server具有相同的值

MySQL 5.7中不推薦使用全域性character_set_database和collation_database系統變數,並將在未來的MySQL版本中刪除它們


character_set_server

The server's default character set.

伺服器的預設字符集。


character_set_system

The character set used by the server for storing identifiers. The value is always utf8.

伺服器用於儲存識別符號的字符集。 值總是utf8。


character_set_client

The character set for statements that arrive from the client. The session value of this variable is set using the character set requested by the client when the client connects to the server. (Many clients support a --default-character-set option to enable this character set to be specified explicitly. See also Section 10.4, “Connection Character Sets and Collations”.) The global value of the variable is used to set the session value in cases when the client-requested value is unknown or not available, or the server is configured to ignore client requests:

The client requests a character set not known to the server. For example, a Japanese-enabled client requests sjis when connecting to a server not configured with sjis support.

The client is from a version of MySQL older than MySQL 4.1, and thus does not request a character set.

mysqld was started with the --skip-character-set-client-handshake option, which causes it to ignore client character set configuration. This reproduces MySQL 4.0 behavior and is useful should you wish to upgrade the server without upgrading all the clients.

從客戶端到達的語句的字符集。 當客戶端連線到伺服器時, 使用客戶端請求的字符集設定此變數的會話值(客戶端請求的字符集意思指的就是客戶端OS上的字符集) 。 (許多客戶端支援--default-character-set選項以顯式指定此字符集。另請參見第10.4節“連線字符集和排序”。)變數的全域性值用於在客戶端請求的值未知或不可用的情況下設定會話值,或者伺服器配置為忽略客戶端請求:

客戶端請求伺服器不知道的字符集。 例如,啟用日語的客戶端在連線到未配置sjis支援的伺服器時請求sjis。

客戶端來自早於MySQL 4.1的MySQL版本,因此不會請求字符集。

mysqld是使用--skip-character-set-client-handshake選項啟動的,這會導致它忽略客戶端字符集配置。 這會重現MySQL 4.0的行為,如果您希望在不升級所有客戶端的情況下升級伺服器,這將非常有用。


character_set_connection

The character set used for literals specified without a character set introducer and for number-to-string conversion

用於指定文字的字符集,這些文字不包括沒有字符集匯入和數字到字串的轉換


character_set_results

The character set used for returning query results to the client. This includes result data such as column values, result metadata such as column names, and error messages.

用於將查詢結果返回給客戶端的字符集。 這包括結果資料,如列值,結果後設資料(如列名稱)和錯誤訊息。


init_connect
A string to be executed by the server for each client that connects. The string consists of one or more SQL statements, separated by semicolon characters.
伺服器為每個連線的客戶端執行的字串。 該字串由一個或多個SQL語句組成,以分號字元分隔。


--default-character-set=charset_name

The --default-character-set=charset_name command option used by MySQL client programs such as mysql and mysqladmin.
Each client supports a --default-character-set option, which enables users to specify the character set explicitly to override whatever default the client otherwise determines.

Use charset_name as the default character set for the client and connection.

This option can be useful if the operating system uses one character set and the mysql client by default uses another. In this case, output may be formatted incorrectly. You can usually fix such issues by using this option to force the client to use the system character set instead.

MySQL客戶端程式 (如mysql和mysqladmin) 使用的--default-character-set = charset_name命令選項
每個客戶端都支援--default-character-set選項,該選項允許使用者顯式指定字符集以覆蓋客戶端否的任何預設值。

使用default-character-set值作為客戶端和連線的預設字符集。

如果作業系統使用一個字符集並且預設情況下mysql客戶端使用另一個字符集,則此選項很有用。 在這種情況下,輸出可能格式不正確。 您通常可以透過使用此選項來強制客戶端使用系統字符集來修復此類問題。



https://dev.mysql.com/doc/refman/5.7/en/create-database.html

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name

    [create_specification] ...

create_specification:

    [DEFAULT] CHARACTER SET [=] charset_name

  | [DEFAULT] COLLATE [=] collation_name

create_specification options specify database characteristics. Database characteristics are stored in the db.opt file in the database directory. The CHARACTER SET clause specifies the default database character set. The COLLATE clause specifies the default database collation.

create_specification選項指定資料庫特徵。 資料庫特徵儲存在資料庫目錄的db.opt檔案中。 CHARACTER SET子句指定預設資料庫字符集。 COLLATE子句指定預設的資料庫排序規則。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30126024/viewspace-2216308/,如需轉載,請註明出處,否則將追究法律責任。

相關文章