欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
MySQL 字符集支持

MySQL 字符集支持

文章所屬標簽: 科技IT 

字符集支持
MySQL 4.1版本改進(jìn)了對字符集處理的支持。這里描述的特性是MySQL 4.1.1 里已經(jīng)
實(shí)現的。(MySQL 4.1.0里有一些,不過(guò)不包含這里的全部特性,并且有的實(shí)現也是不同的)

本章討論下面的主題:

·什么是字符集和 collations?
·The multiple-level default system
·MySQL 4.1 里新的語(yǔ)法
·Affected functions and operations
·Unicode 支持
·每種特殊字符集和 collation 的含義


現在在 MyISAM, MEMORY (HEAP), 和 (從 MySQL 4.1.2開(kāi)始) InnoDB 等存儲引擎里包含
字符集支持. ISAM 存儲引擎不包含字符集支持; 也沒(méi)有計劃加入, 因為 ISAM 已經(jīng)被
淘汰了


10.1 字符集和Collations的一般介紹

一個(gè)character set (字符集)是一組符號和編碼,而一個(gè) collation 是在一個(gè)字符集里
比較字符的一套規則,讓我們通過(guò)一個(gè)虛構的字符集例子來(lái)說(shuō)明區別。

假設我們有個(gè)四個(gè)字母的字母表:`A‘, `B‘, `a‘, `b‘.我們給每個(gè)字母一個(gè)編號:
`A‘ = 0, `B‘ = 1, `a‘ = 2, `b‘ = 3. 字母`A‘ 是一個(gè)符號,而數字0是 `A‘ 的
encoding(編碼),而這四個(gè)字母和他們的編碼合起來(lái)就是一個(gè)字符集(character set)。

現在,假設我們要比較兩個(gè)字符串的值,`A‘ 和`B‘,最簡(jiǎn)單的方法是看編碼,`A‘ 是 0
而 `B‘是 1. 因為0比1小,我們就說(shuō)`A‘ 比 `B‘ 小?,F在,我們就算已經(jīng)對我們的字符
集使用了一個(gè)collation,collation 是一組規則(在這個(gè)例子里只有一條規則):
"比較編碼".我們把所有可能的 collation 中最簡(jiǎn)單的這種叫做binary collation

但是如果我們想讓大寫(xiě)字母和小寫(xiě)字母一樣怎么辦?那么我們就得有兩條規則:
(1)把小寫(xiě)字母`a‘ 和 `b‘ 看作跟 `A‘ 和 `B‘相等;
(2)然后比較編碼。
我們稱(chēng)這是一個(gè)case-insensitive collation(不區分大小寫(xiě)的 collation).
這比binary collation 稍微復雜了一點(diǎn)。

在實(shí)際生活中,大多數字符集都包含很多字符:不是僅僅`A‘和`B‘ 而是整個(gè)字母表,
有時(shí)是多個(gè)字母表或者東方書(shū)寫(xiě)系統里幾千的字符,和很多專(zhuān)有符號和標點(diǎn)符。
并且在實(shí)際生活中,大多數的collations 有很多規則:除了不區分大小寫(xiě)外還有不區分
重音(重音``accent‘‘ 是像在德語(yǔ)里字符附加的重音符那樣的)和多字符映射。

MySQL 4.1 可以為你做以下事:

·使用各種字符集存儲字符串
·使用各種collation比較字符串。
·在同一臺服務(wù)器上或者同一個(gè)數據庫甚至同一個(gè)表中使用不同的字符集和collation混合
·允許在任何級別上指明字符集和collation


在這些方面,MySQL 4.1 不只遠遠比MySQL 4.0復雜,也比其他DBMS先進(jìn)很多。不過(guò)要想
有效的使用這些新特性,你需要學(xué)習哪些字符集和collation是可用的,怎樣把他們改成
默認,還有各種字符串運算符如何操作他們。


10.2 MySQL 里的字符集和Collations

MySQL 服務(wù)器可支持多個(gè)字符集。要列出可用的字符集,使用 SHOW CHARACTER SET 語(yǔ)句:

mysql> SHOW CHARACTER SET;
+----------+-----------------------------+---------------------+
| Charset | Description | Default collation |
+----------+-----------------------------+---------------------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci |
| dec8 | DEC West European | dec8_swedish_ci |
| cp850 | DOS West European | cp850_general_ci |
| hp8 | HP West European | hp8_english_ci |
| koi8r | KOI8-R Relcom Russian | koi8r_general_ci |
| latin1 | ISO 8859-1 West European | latin1_swedish_ci |
| latin2 | ISO 8859-2 Central European | latin2_general_ci |
...


輸出實(shí)際上包含另一列,這里為了讓例子在頁(yè)面上顯示更合適,沒(méi)顯示出來(lái)

任一給出的字符集至少包含一個(gè)collation. 它可能包含多個(gè) collations.

要列出一個(gè)字符集的 collations , 使用 SHOW COLLATION 語(yǔ)句. 例如, 要看latin1
(``ISO-8859-1 West European‘‘)的collations, 使用這個(gè)語(yǔ)句來(lái)找到哪些名字以latin1
開(kāi)頭的collation

mysql> SHOW COLLATION like ‘latin1%‘;
+-------------------+---------+----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+-------------------+---------+----+---------+----------+---------+
| latin1_german1_ci | latin1 | 5 | | | 0 |
| latin1_swedish_ci | latin1 | 8 | Yes | Yes | 1 |
| latin1_danish_ci | latin1 | 15 | | | 0 |
| latin1_german2_ci | latin1 | 31 | | Yes | 2 |
| latin1_bin | latin1 | 47 | | Yes | 1 |
| latin1_general_ci | latin1 | 48 | | | 0 |
| latin1_general_cs | latin1 | 49 | | | 0 |
| latin1_spanish_ci | latin1 | 94 | | | 0 |
+-------------------+---------+----+---------+----------+---------+


latin1 collations 有下列含義:

Collation 含義
latin1_bin Binary according to latin1 encoding
latin1_danish_ci Danish/Norwegian
latin1_general_ci Multilingual
latin1_general_cs Multilingual, case sensitive
latin1_german1_ci German DIN-1
latin1_german2_ci German DIN-2
latin1_spanish_ci Modern Spanish
latin1_swedish_ci Swedish/Finnish


Collations 有這些一般特性:

·兩個(gè)不同字符集沒(méi)法擁有同一個(gè)collation.
·每個(gè)字符集有一個(gè)默認 collation. 例如, latin1 的默認 collation 是
latin1_swedish_ci.
·collation 的命名有個(gè)約定: 他們由所關(guān)聯(lián)的字符集的名字打頭,他們通常包含一個(gè)
語(yǔ)言名, 并以 _ci (case insensitive大小寫(xiě)不敏感),
或者 _cs (case sensitive大小寫(xiě)敏感), 或者 _bin (binary二進(jìn)制).


10.3 決定默認字符集和 Collation

有四個(gè)級別上的默認字符集和collation設置: 服務(wù)器,數據庫,表和連接。下面的描述
可能看起來(lái)復雜,不過(guò)實(shí)踐中得出多級默認設置可以帶來(lái)自然而然的結果。


10.3.1 服務(wù)器級字符集和 Collation

MySQL服務(wù)器有一個(gè)服務(wù)器級別的字符集和 collation, 不能為空。

MySQL 這樣決定服務(wù)器級的字符集和collation
·當服務(wù)器開(kāi)始按照有效選項設置
·運行期間按照變量

在服務(wù)器級別,決定是很簡(jiǎn)單的,依靠你執行mysqld時(shí)使用的選項來(lái)決定服務(wù)器字符集
和collation。你可以使用--default-character-set 來(lái)指定字符集,并且和這個(gè)一起
還可以為collation加上--default-collation 。如果你不指定字符集,就相當于說(shuō)
--default-character-set=latin1。如果你只指定了字符集(例如,latin1)但是沒(méi)有指定
collation,就相當于
--default-charset=latin1 --default-collation=latin1_swedish_ci
因為 latin1_swedish_ci是latin1字符集的默認collation, 因此下面三個(gè)命令都具有
同樣效果:

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


有個(gè)改變這個(gè)設置的方法是重新編譯,如果你想編譯源碼來(lái)改變默認的服務(wù)器字符集和
collation,在configure使加上參數--with-charset 和 --with-collation ,例如:

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


或者:

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


mysqld 和configure 都會(huì )核實(shí)字符集/collation的結合是否有效,如果無(wú)效,這兩個(gè)
程序都會(huì )報錯并中止。

現行服務(wù)器字符集和collation 是和character_set_server 和 collation_server
這兩個(gè)系統變量的值一樣,這些變量可以在運行時(shí)更改


10.3.2 數據庫字符集和 Collation

每個(gè)數據庫都有一個(gè)數據庫字符集和數據庫collation,并且不能為空,create DATABASE
和 alter DATABASE 語(yǔ)句有專(zhuān)門(mén)指明數據庫字符集和collation的可選子句:

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可以這樣選擇數據庫字符集和數據庫collation:

·如果 CHARACTER SET X 和 COLLATE Y 被指定了, 那么字符集是 X collation 是 Y.
·如果 CHARACTER SET X 被指定,但是沒(méi)有指定 COLLATE, 那么字符集是 X collation
是默認collation.
·否則, 就用服務(wù)器字符集和服務(wù)器 collation.

MySQL 的 create DATABASE ... DEFAULT CHARACTER SET ... 語(yǔ)法類(lèi)似于標準 SQL
的 create SCHEMA ... CHARACTER SET ... 語(yǔ)法. 因為這樣, 就可能在同一個(gè)MySQL
服務(wù)器上創(chuàng )建具有不同字符集和collation的數據庫。

如果在建表的語(yǔ)句里沒(méi)有指定表的字符集和collation,那么數據庫字符集和 collation
就作為表的字符集和collation的默認值. 它們沒(méi)有別的作用。

默認數據庫的字符集和 collation是和 character_set_database 以及
collation_database 這兩個(gè)系統變量的值一樣。 當默認數據庫更改時(shí)服務(wù)程序會(huì )設置
這些變量的值。如果沒(méi)有默認數據庫, 變量的值會(huì )和配套的服務(wù)器級系統變量
character_set_server 以及 collation_server的值一致.


10.3.3 表字符集和 Collation

每個(gè)表有一個(gè)表字符集以及一個(gè)表collation,不能為空。create TABLE 和 alter TABLE
語(yǔ)句有可選子句指定表字符集和collation。

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 通過(guò)下面的方法選擇表字符集和collation:

·如果 CHARACTER SET X 和 COLLATE Y 都被指定了, 那么字符集就是 X collation 是Y
·如果只指定了CHARACTER SET X 而沒(méi)有指定 COLLATE, 那么字符集為 X 并配默認的
collation.
·否則就使用數據庫字符集和 collation.

表字符集和 collation 用來(lái)在沒(méi)有指定個(gè)別列字符集和列collation的時(shí)候做為它們
的默認值。表字符集和 collation 是MySQL 的擴展;在標準SQL里沒(méi)有這種東西

10.3.4 列字符集和 Collation

每個(gè)``character‘‘ 列(是指列屬性為CHAR, VARCHAR, 或 TEXT的)都有一個(gè)列字符集
和一個(gè)列collation,不能為空。列定義語(yǔ)句有可選子句指定列字符集和collation:

col_name {CHAR | VARCHAR | TEXT} (col_length)
[CHARACTER SET charset_name [COLLATE collation_name]]

Example:

create TABLE Table1
(
column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci
);


MySQL 這樣選擇列字符集和collation:

·如果 CHARACTER SET X 和 COLLATE Y 都被指定了, 那么字符集就是 X collation 就是 Y.
·如果指定了 CHARACTER SET X 但沒(méi)有指定 COLLATE, 那么字符集是 X 并配默認的collation.
·否則,就用表字符集和 collation.
CHARACTER SET 和 COLLATE 子句是標準SQL.

10.3.5 字符集和 Collation 分配的例子

下面的例子顯示了 MySQL 怎樣決定默認的字符集和collation的值:

例子1:表+列定義

create TABLE t1
(
c1 CHAR(10) CHARACTER SET latin1 COLLATE latin1_german1_ci
) DEFAULT CHARACTER SET latin2 COLLATE latin2_bin;


這里我們有一個(gè)用latin1的字符集和latin1_german1_ci collation的列。
定義非常明顯,所以很簡(jiǎn)單。注意把一個(gè)latin1 的列存到一個(gè)latin2的表里不會(huì )有問(wèn)題

例子2:表+列定義

create TABLE t1
(
c1 CHAR(10) CHARACTER SET latin1
) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;


這次我們有一列是latin1字符集加默認的collation?,F在,雖然它看上去很自然,
但是默認的collation卻不是從表級繼承而來(lái)。事實(shí)上,因為latin1的默認collation
始終是latin1_swedish_ci,所以c1列的collation是latin1_swedish_ci (而不是
latin1_danish_ci).

例子3:表+列定義

create TABLE t1
(
c1 CHAR(10)
) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;


我們有一個(gè)默認字符集和默認collation的列。在這個(gè)環(huán)境下,MySQL向上到表級決定
列字符集和collation。所以,c1的列字符集是latin1,它的collation是
latin1_danish_ci

例子4:數據庫+表+列定義

create DATABASE d1
DEFAULT CHARACTER SET latin2 COLLATE latin2_czech_ci;
USE d1;
create TABLE t1
(
c1 CHAR(10)
);


我們創(chuàng )建了一個(gè)沒(méi)有指定列字符集和collation的列。我們也沒(méi)有指定表級字符集和
collation。在這個(gè)條件下,MySQL向上到數據庫級決定。(數據庫的設置變?yōu)楸淼脑O置,
之后成為列的設置),所以c1的列字符集是latin2,collation是latin2_czech_ci


10.3.6 連接的字符集和Collations

一些字符集和collation和用戶(hù)對服務(wù)器的作用結合。有些在前面已經(jīng)提及了:

·服務(wù)器的字符集和collation和 character_set_server 及 collation_server 變量
的值一樣
·默認數據庫的字符集和collation和 character_set_database 及 collation_database
變量的值一樣.

附加的字符集和collation 變量被引入用來(lái)處理服務(wù)器和客戶(hù)端之間連接得通信。每個(gè)
客戶(hù)端都有連接相關(guān)的字符集和collation變量。

想想"連接"是什么:是你連到服務(wù)器時(shí)作的事情??蛻?hù)端通過(guò)這條連接發(fā)送SQL語(yǔ)句,
比如查詢(xún),服務(wù)器則通過(guò)這條連接給客戶(hù)端送回回應,比如查詢(xún)結果結果集合,這導致
了客戶(hù)端處理字符集和collation的一些問(wèn)題,它們每個(gè)都可以按照系統變量來(lái)回答:

·當查詢(xún)離開(kāi)客戶(hù)端的時(shí)候應該是什么字符集的?服務(wù)器用character_set_client
這個(gè)變量來(lái)作為客戶(hù)端發(fā)送查詢(xún)所用的字符集
·服務(wù)器端在接收到了查詢(xún)以后應該把它翻譯到社么字符集里?對于這個(gè),服務(wù)程序
用的是character_set_connection 和 collation_connection 這兩個(gè)變量。
它把客戶(hù)端送來(lái)的查詢(xún)從character_set_client 轉換成character_set_connection
(除了latin1或者utf8 的字符串)。collation_connection 對于比較字符串非常
重要,對于列值比較字符串是沒(méi)有關(guān)系的,因為列擁有高優(yōu)先級
·當服務(wù)程序要送回結果集合或者錯誤信息給客戶(hù)端時(shí)應該用什么字符集?
character_set_results 變量指示了這個(gè)值,這包括了列值,或者列名等結果數據。

你可以調整這些變量的值,或者就使用默認的(那樣就可以省略這節了)

有兩個(gè)語(yǔ)句影響連接字符集設置:
SET NAMES ‘charset_name‘
SET CHARACTER SET charset_name

SET NAMES 指出客戶(hù)端送出的SQL語(yǔ)句里是什么。因此,SET NAMES ‘cp1251‘ 就告訴服務(wù)
程序"下面將要從這個(gè)客戶(hù)端送來(lái)的信息將是使用‘cp1251‘這個(gè)字符集。這也指定了
服務(wù)程序送回的結果所用的字符集,(例如如果你用了一個(gè)select語(yǔ)句它會(huì )指出列值
擁有的字符集)

SET NAMES ‘x‘ 語(yǔ)句相當于下面三個(gè)語(yǔ)句:

mysql> SET character_set_client = x;
mysql> SET character_set_results = x;
mysql> SET character_set_connection = x;


把character_set_connection 設置成x也會(huì )把collation_connection 設置成默認
collation x

SET CHARACTER SET 是類(lèi)似的,不過(guò)是把連接字符集和collation設置成那些默認數據庫。
SET CHARACTER SET x 語(yǔ)句相當于這三個(gè)語(yǔ)句:

mysql> SET character_set_client = x;
mysql> SET character_set_results = x;
mysql> SET collation_connection = @@collation_database;


當一個(gè)客戶(hù)連接,它向服務(wù)程序發(fā)送它想使用的字符集的名字,服務(wù)程序把
character_set_client, character_set_results, 和 character_set_connection
這些變量設置成那個(gè)字符集(事實(shí)上,服務(wù)程序使用字符集執行了SET NAMES 操作)

如果你不想用默認字符集,使用 Mysql 客戶(hù)端程序不需要每次啟動(dòng)時(shí)執行SET NAMES 。
你可以在mysql 執行語(yǔ)句行加上--default-character-set 這個(gè)選項,或者在你的選項
文件里加上。比如,下面的選項文件設置使你每次執行mysql程序時(shí)把默認字符集變量
改成 koi8r:

[mysql]
default-character-set=koi8r


例如:假設column1定義是 CHAR(5) CHARACTER SET latin2。如果你不用SET NAMES
或者 SET CHARACTER SET,那么對于你的 select column1 FROM t 請求,服務(wù)程序
會(huì )把column1 的所有值用連接建立時(shí)客戶(hù)端指定的字符集來(lái)回送。另一方面,如果你
用了 SET NAMES ‘latin1‘ or SET CHARACTER SET latin1 ,那么在送回結果之前,
服務(wù)程序會(huì )把 latin2 的值轉成latin1,如果里面有兩種字符集里都沒(méi)有的字符,
轉化會(huì )有損耗。

如果你不希望服務(wù)程序作任何轉換,就把character_set_results 設置成 NULL

mysql> SET character_set_results = NULL;



10.3.7. 字符串文字字符集和collation

每個(gè)字符串文字都有自己的字符集和collation,不能為空

一個(gè)字符串文字可能有一個(gè)可選字符集introducer和COLLATION子句:

[_charset_name]‘string‘ [COLLATE collation_name]


例如:

select ‘string‘;
select _latin1‘string‘;
select _latin1‘string‘ COLLATE latin1_danish_ci;


對于簡(jiǎn)單語(yǔ)句 select ‘string‘,字符串的字符集和collation是由兩個(gè)系統變量
character_set_connection 和 collation_connection 定義的。

_charset_name 表達式正式情況下被叫做 introducer .它告訴分析器"下面的字符串
是使用 X 字符集的。"因為這在以前造成很多人的困擾,我們強調一下introducer
并不作任何轉換,嚴格來(lái)講并不改變字符串的值,只是一個(gè)符號。introducer 在
標準16進(jìn)制文字前和數字16進(jìn)制記法前都是合法的(x‘literal‘ 和 0xnnnn),
在?前面也是合法的(當在程序設計語(yǔ)言接口里使用預備語(yǔ)句時(shí)作參數替換)

例如:

select _latin1 x‘AABBCC‘;
select _latin1 0xAABBCC;
select _latin1 ?;


MySQL 這樣決定一個(gè)文字的字符集和collation:

·如果 _X 和 COLLATE Y 都被指定了,那么字符集就是 X collation 是 Y
·如果 指定了 _X 而沒(méi)有指定 COLLATE ,那么字符集是 X collation 是 X 的默認
collation
·否則,由系統變量 character_set_connection 和 collation_connection 決定字符集
和collation

例如:
·一個(gè)字符集是 latin1 而collation是 latin1_german1_ci 的字符串:

select _latin1‘Müller‘ COLLATE latin1_german1_ci;


·一個(gè)字符集是 latin1 以及其配套默認collation的(latin1_swedish_ci)字符串:

select _latin1‘Müller‘;


·一個(gè)連接默認字符集和collation的字符串:

select ‘Müller‘;


字符集 introducer 和 COLLATE 子句是符合標準 SQL 規則的工具


10.3.8. 在 SQL 語(yǔ)句里使用 COLLATE

通過(guò) COLLATE 子句,你可以在比較時(shí)覆蓋替換掉任何默認collation, COLLATE 可以用
在SQL 語(yǔ)句的很多部分里,這里是一些例子:

·在 ORDER BY 里:

select k
FROM t1
ORDER BY k COLLATE latin1_german2_ci;


·在 AS 里:

select k COLLATE latin1_german2_ci AS k1
FROM t1
ORDER BY k1;


·在GROUP BY里 :

select k
FROM t1
GROUP BY k COLLATE latin1_german2_ci;


·在集合函數里:

select MAX(k COLLATE latin1_german2_ci)
FROM t1;


·在DISTINCT里

select DISTINCT k COLLATE latin1_german2_ci
FROM t1;


·在where 里:

select *
FROM t1
where _latin1 ‘Müller‘ COLLATE latin1_german2_ci = k;


·在HAVING里:

select k
FROM t1
GROUP BY k
HAVING k = _latin1 ‘Müller‘ COLLATE latin1_german2_ci;



User Comments
Posted by [name withheld] on January 14 2005 2:33pm

在不同的列/表里:

select t1.k FROM t1 where NOT EXISTS
( select * FROM t2 where t1.k=t2.k COLLATE latin1_german2_ci);


在collation 之間比較列的時(shí)候能夠避免出錯信息。


10.3.9. COLLATE 子句優(yōu)先級

COLLATE子句具有高優(yōu)先級(比||高),所以下面兩個(gè)表達式是相同的:

x || y COLLATE z
x || (y COLLATE z)



10.3.10. BINARY 運算

BINARY 運算是COLLATE 子句的速記法,BINARY ‘x‘ 和 ‘x‘ COLLATE y 是相同的,
y 是字符集 ‘x‘ 的二元collation 的名字。每個(gè)字符集都有二元 collation。例如,
latin1 字符集的 collation 是latin1_bin,所以如果列 a 是latin1 字符集,下面
兩個(gè)語(yǔ)句有同樣效果:

select * FROM t1 ORDER BY BINARY a;
select * FROM t1 ORDER BY a COLLATE latin1_bin;



10.3.11. 一些決定collation 比較棘手的情況

在絕大多數查詢(xún)里,MySQL 用什么collation來(lái)進(jìn)行比較操作都是很顯而易見(jiàn)的,例如,
在下面的情況里,很顯然collation 應該是"列 x 的列 collation":

select x FROM T ORDER BY x;
select x FROM T where x = x;
select DISTINCT x FROM T;


但是,當卷入了多操作數時(shí),就很難搞了,例如:

select x FROM T where x = ‘Y‘;


這個(gè)查詢(xún)應該使用列 x 的collation 呢,還是使用字符串‘Y‘ 的?

標準SQL 使用被叫做``coercibility‘‘ 的規則來(lái)解決這個(gè)問(wèn)題。本質(zhì)就是:因為
x 和 ‘Y‘ 都有collation ,優(yōu)先使用誰(shuí)的collation呢?這很復雜,不過(guò)下面的規則能
應付大多數情況:

·一個(gè)COLLATE 子句的 coercibility 是0 (也就是根本不coercible)

·兩個(gè)具有不同collation 的字符串連結的 coercibility 是1

·一個(gè)列的 collation 的 coercibility 是 2

·一個(gè)文字型的collation 的 coercibility 是3。

那些規則這樣解決含混:

·使用具有最低 coercibility 值的collation

·如果兩邊具有相同的 coercibility, 如果兩個(gè)collation 不同那就是錯誤。

例如:

column1 = ‘A‘ 使用column1的collation
column1 = ‘A‘ COLLATE x 使用 ‘A‘ 的collation
column1 COLLATE x = ‘A‘ COLLATE y Error


COERCIBILITY() 函數可以用來(lái)判斷一個(gè)字符串表達式的coercibility:

mysql> select COERCIBILITY(‘A‘ COLLATE latin1_swedish_ci);
-> 0
mysql> select COERCIBILITY(‘A‘);
-> 3



User Comments
Posted by Thierry Danard on November 5 2004 10:34pm

對于數據庫引擎來(lái)說(shuō)顯而易見(jiàn)的排序并不是總那么顯而易見(jiàn)(version 4.1).

一個(gè)沒(méi)有帶類(lèi)似于"select concat(mycolumn, ‘%‘) from mytable "這樣的排序指令
的查詢(xún)在"mycolumn" 和"%"的字符集不相同的情況下不會(huì )工作。

在我這里,整個(gè)數據庫使用 UTF-8, 默認情況下, ‘%‘ 假設是 latin1,
causing an error to be triggered。


10.3.12. Collations Must Be for the Right Character Set

記得說(shuō)過(guò)每個(gè)字符集都有一個(gè)或者多個(gè)collation,每個(gè)collation只和一個(gè)字符集關(guān)聯(lián)。
因此,下面的語(yǔ)句會(huì )導致錯誤,因為 latin2_bin 這個(gè)collation 和 latin1 這個(gè)字符集
不配套。

mysql> select _latin1 ‘x‘ COLLATE latin2_bin;
ERROR 1251: COLLATION ‘latin2_bin‘ is not valid
for CHARACTER SET ‘latin1‘


在某些情況下,在 MySQL 4.1 前工作的表達式會(huì )在MySQL 4.1以后的版本失敗,
如果你在賬號里沒(méi)有字符集和collation的話(huà)。例如,在 MySQL 4.1 前,這個(gè)語(yǔ)句
會(huì )這樣工作:

mysql> select SUBSTRING_INDEX(USER(),‘@‘,1);
+-------------------------------+
| SUBSTRING_INDEX(USER(),‘@‘,1) |
+-------------------------------+
| root |
+-------------------------------+


升級到MySQL 4.1 以后,語(yǔ)句失效:

mysql> select SUBSTRING_INDEX(USER(),‘@‘,1);
ERROR 1267 (HY000): Illegal mix of collations
(utf8_general_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE)
for operation ‘substr_index‘


發(fā)生這個(gè)的原因是username 使用utf8存儲(參看10.6節),因此, USER() 函數
和文字型字符串‘@‘具有不同的字符集(當然也是不同collation):

mysql> select COLLATION(USER()), COLLATION(‘@‘);
+-------------------+-------------------+
| COLLATION(USER()) | COLLATION(‘@‘) |
+-------------------+-------------------+
| utf8_general_ci | latin1_swedish_ci |
+-------------------+-------------------+


解決的一個(gè)方法是告訴MySQL把文字型字符串翻譯成utf8:

mysql> select SUBSTRING_INDEX(USER(),_utf8‘@‘,1);
+------------------------------------+
| SUBSTRING_INDEX(USER(),_utf8‘@‘,1) |
+------------------------------------+
| root |
+------------------------------------+


另一個(gè)方法是把連接的字符集和collation改成utf8,你可以使用SET NAMES ‘utf8‘
或者直接設置兩個(gè)系統變量character_set_connection 和 collation_connection
的值來(lái)達到這個(gè)目的。


10.3.13. Collation 的效果的一個(gè)例子

假設表 T 里的列 X 具有這些 latin1 的列值:

Muffler
Müller
MX Systems
MySQL


并且假設這些列值可以用下列語(yǔ)句找回:

select X FROM T ORDER BY X COLLATE collation_name;


在這張表中列出了不同collation 的結果值的結果排序

latin1_swedish_ci latin1_german1_ci latin1_german2_ci
Muffler Muffler Müller
MX Systems Müller Muffler
Müller MX Systems MX Systems
MySQL MySQL MySQL


這張表顯示了如果我們在一個(gè) ORDER BY 子句里使用不同collation 會(huì )有什么樣的效果
的例子,導致這種不同排序結果的字符是上面有兩個(gè)點(diǎn)的 U,在德語(yǔ)里叫做U-曲音,
不過(guò)我們叫做U-分音符

·第一列顯示了使用瑞典/芬蘭 collation 規則的 select 的結果,U-分音符
通過(guò)Y歸類(lèi)

·第二列顯示了使用德語(yǔ)DIN-1 規則的select 語(yǔ)句的結果,U-分音符通過(guò)U歸類(lèi)

·第三列顯示了使用德語(yǔ)DIN-2 規則的select 語(yǔ)句的結果,U-分音符通過(guò)UE歸類(lèi)

三種不同的collation ,三種不同的結果,這是MySQL 在這里的處理。通過(guò)使用合適的
collation,你可以選擇你想要的排序次序。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
MySQL 的 collation
再見(jiàn)亂碼:5分鐘讀懂MySQL字符集設置
綜合網(wǎng)上解決mysql 5.7保存emoji 失敗問(wèn)題
pommo mailinglist - 網(wǎng)站設計 - 設計管理在線(xiàn) |設計管理至關(guān)重要|設...
MySQL字符集詳解
主題:關(guān)于MySql字符集的問(wèn)題
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久