mysql字符集和校對簡析

2021-12-30 09:44:43 字數 4488 閱讀 2394

mysql字符集和校對簡析

use case

首先看個例子:

有個user 表

www.2cto.com  

user( username varchar(5) character set utf8collate utf8_general_ci);

有記錄('username');和('username');

使用 select * from user where username='username';   將會選出兩條資料

然後將username的collate改為utf8_bin;

user( username varchar(5) character set utf8 collate utf8_bin);

再使用 select * from user where username='username';   將會選出第一條資料

這是為什麼呢?請往下看:

字符集(character set)是一套符號和編碼。校對規則(collate)是在字符集內用於比較字元的一套規則。讓我們使用乙個假想字符集的例子來區別清楚。

假設我們有乙個字母表使用了四個字母:『a』、『b』、『a』、『b』。我們為每個字母賦予乙個數值:『a』=0,『b』= 1,『a』= 2,『b』= 3。字母『a』是乙個符號,數字0是『a』的編碼,這四個字母和它們的編碼組合在一起是乙個字符集。

假設我們希望比較兩個字串的值:『a』和『b』。比較的最簡單的方法是查詢編碼:『a』為0,『b』為1。因為0 小於1,我們可以說『a』小於『b』。我們做的僅僅是在我們的字符集上應用了乙個 校對規則。校對規則是一套規則(在這種情況下僅僅是一套規則):「對編碼進行比較。」我們稱這種全部可能的規則中的最簡單的 校對規則為乙個binary(二元)校對規則。

但是,如果我們希望小寫字母和大寫字母是等價的,應該怎樣?那麼,我們將至少有兩個規則:(1)把小寫字母『a』和『b』視為與『a』和『b』等價;(2)然後比較編碼。我們稱這是乙個大小寫不敏感的 校對規則。比二元校對規則複雜一些。

mysql支援的字符集和校對

伺服器字符集和校對

mysql伺服器有乙個伺服器字符集和乙個伺服器校對規則,它們均不能設定為空。

mysql按照如下方法確定伺服器字符集和伺服器校對規則:

· 當伺服器啟動時根據有效的選項設定

· 根據執行時的設定值

在伺服器級別,確定方法很簡單。當啟動mysqld時,根據使用的初始選項設定來確定伺服器字符集和 校對規則。可以使用--default-character-set設定字符集,並且可以在字符集後面為 校對規則新增--default-collation。如果沒有指定乙個字符集,那就與--default-character-set=latin1相同。如果你僅指定了乙個字符集(例如,latin1),但是沒有指定乙個 校對規則,那就與--default-charset=latin1 --default-collation=latin1_swedish_ci相同,因為latin1_swedish_ci是latin1的預設校對規則。因此,以下三個命令有相同的效果:

www.2cto.com  

shell> mysqld

shell> mysqld --default-character-set=latin1

shell> mysqld --default-character-set=latin1 \

--default-collation=latin1_swedish_ci

更改設定值的乙個方法是通過重新編譯。如果希望在從源程式構建時更改預設伺服器字符集和校對規則,使用:--with-charset和--with-collation作為configure的參量。例如:

shell> ./configure --with-charset=latin1

或者: 

shell> ./configure --with-charset=latin1 \

--with-collation=latin1_german1_ci

mysqld和configure都驗證字符集/校對規則組合是否有效。如果無效,每個程式都顯示乙個錯誤資訊,然後終止。

當前的伺服器字符集和校對規則可以用作character_set_server和collation_server系統變數的值。在執行時能夠改變這些變數的值。

資料庫字符集和校對

每乙個資料庫有乙個資料庫字符集和乙個資料庫校對規則,它不能夠為空。create database和alter database語句有乙個可選的子句來指定資料庫字符集和校對規則:

create database db_name

[[default] character set charset_name]

[[default] collate collation_name]

alter database db_name

[[default] character set charset_name]

[[default] collate collation_name]

例如: 

create database db_name

default character set latin1 collate latin1_swedish_ci;

mysql這樣選擇資料庫字符集和資料庫校對規則:

· 如果指定了character set x和collate y,那麼採用字符集x和校對規則y。

· 如果指定了character set x而沒有指定collate y,那麼採用character set x和character set x的預設校對規則。

· 否則,採用伺服器字符集和伺服器校對規則。

www.2cto.com  

mysql的create database ... default character set ...語法與標準sql的create schema ... character set ...語法類似。因此,可以在同乙個mysql伺服器上建立使用不同字符集和 校對規則的資料庫。

如果在create table語句中沒有指定表字符集和校對規則,則使用資料庫字符集和校對規則作為預設值。它們沒有其它目的。

預設資料庫的字符集和校對規則可以用作character_set_database和 collation_database系統變數。無論何時預設資料庫更改了,伺服器都設定這兩個變數的值。如果沒有 預設資料庫,這兩個變數與相應的伺服器級別的變數(character_set_server和collation_server)具有相同的值。

表字符集和校對

每乙個表有乙個表字符集和乙個校對規則,它不能為空。為指定表字符集和校對規則,create table 和alter table語句有乙個可選的子句:

create table tbl_name (column_list)

[default character set charset_name [collate collation_name]]

alter table tbl_name

[default character set charset_name] [collate collation_name]

例如: 

create table t1 ( ... )

default character set latin1 collate latin1_danish_ci;

mysql按照下面的方式選擇表字符集和 校對規則:

·  如果指定了character set x和collate y,那麼採用character set x和collate y。  www.2cto.com  

·  如果指定了character set x而沒有指定collate y,那麼採用character set x和character set x的預設校對規則。

·  否則,採用伺服器字符集和伺服器校對規則。

如果在列定義中沒有指定列字符集和校對規則,則預設使用表字符集和校對規則。表字符集和校對規則是mysql的擴充套件;在標準sql中沒有。

列字符集和校對

每乙個「字元」列(即,char、varchar或text型別的列)有乙個列字符集和乙個列 校對規則,它不能為空。列定義語法有乙個可選子句來指定列字符集和校對規則:

col_name (col_length)

[character set charset_name [collate collation_name]]

例如: 

create table table1

(    column1 varchar(5) character set latin1 collate latin1_german1_ci); 

mysql按照下面的方式選擇列字符集和校對規則:

www.2cto.com  

·  如果指定了character set x和collate y,那麼採用character set x和collate y。

·  如果指定了character set x而沒有指定collate y,那麼採用character set x和character set x的預設校對規則。

·  否則,採用表字符集和伺服器校對規則。

character set和collate子句是標準的sql。

MySQL 字符集和校對

字符集是指一種從二進位制編碼到某類字元符號的對映,校對是一組用於某個字符集的排序規則。每一類編碼字元都有其對應的字符集和校對規則 每種字符集都可能有多種校對規則,並且都有乙個預設的校對規則。每個校對規則都是針對某個特定的字符集的,和其他的字符集都沒有關係。校對規則和字符集總是一起使用的,我們也將這樣...

mysql字符集和校對規則 Mysql校對集

簡要說明 字符集和校對規則 字符集是一套符號和編碼。校對規則是在字符集內用於比較字元的一套規則。mysql在collation提供較強的支援,oracel在這方面沒查到相應的資料。校對規則一般分為兩類 binary collation,二元法,直接比較字元的編碼,可以認為是區分大小寫的,因為字符集中...

mysql字符集和校對規則 Mysql校對集

字符集的概念大家都清楚,校對規則很多人不了解,一般資料庫開發中也用不到這個概念,mysql在這方便貌似很先進,大概介紹一下 簡要說明 字符集和校對規則 字符集是一套符號和編碼。校對規則是在字符集內用於比較字元的一套規則。mysql在collation提供較強的支援,oracel在這方面沒查到相應的資...