日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql collation utf8_mysql数据库 表字段 的collation utf8_unicode_ci

發(fā)布時間:2025/3/21 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql collation utf8_mysql数据库 表字段 的collation utf8_unicode_ci 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

字符集和Collations的一般介紹

一個character set (字符集)是一組符號和編碼,而一個 collation 是在一個字符集里

比較字符的一套規(guī)則,讓我們通過一個虛構(gòu)的字符集例子來說明區(qū)別。

假設(shè)我們有個四個字母的字母表:`A', `B', `a', `b'.我們給每個字母一個編號:

`A' = 0, `B' = 1, `a' = 2, `b' = 3. 字母`A' 是一個符號,而數(shù)字0是 `A' 的

encoding(編碼),而這四個字母和他們的編碼合起來就是一個字符集(character set)。

現(xiàn)在,假設(shè)我們要比較兩個字符串的值,`A' 和`B',最簡單的方法是看編碼,`A' 是 0

而 `B'是 1. 因為0比1小,我們就說`A' 比 `B' 小。現(xiàn)在,我們就算已經(jīng)對我們的字符

集使用了一個collation,collation 是一組規(guī)則(在這個例子里只有一條規(guī)則):

"比較編碼".我們把所有可能的 collation 中最簡單的這種叫做binary collation

但是如果我們想讓大寫字母和小寫字母一樣怎么辦?那么我們就得有兩條規(guī)則:

(1)把小寫字母`a' 和 `b' 看作跟 `A' 和 `B'相等;

(2)然后比較編碼。

我們稱這是一個case-insensitive collation(不區(qū)分大小寫的 collation).

這比binary collation 稍微復(fù)雜了一點。

在實際生活中,大多數(shù)字符集都包含很多字符:不是僅僅`A'和`B' 而是整個字母表,

有時是多個字母表或者東方書寫系統(tǒng)里幾千的字符,和很多專有符號和標點符。

并且在實際生活中,大多數(shù)的collations 有很多規(guī)則:除了不區(qū)分大小寫外還有不區(qū)分

重音(重音``accent'' 是像在德語里字符附加的重音符那樣的)和多字符映射。

MySQL 4.1 可以為你做以下事:

·使用各種字符集存儲字符串

·使用各種collation比較字符串。

·在同一臺服務(wù)器上或者同一個數(shù)據(jù)庫甚至同一個表中使用不同的字符集和collation混合

·允許在任何級別上指明字符集和collation

在這些方面,MySQL 4.1 不只遠遠比MySQL 4.0復(fù)雜,也比其他DBMS先進很多。不過要想

有效的使用這些新特性,你需要學(xué)習(xí)哪些字符集和collation是可用的,怎樣把他們改成

默認,還有各種字符串運算符如何操作他們。

10.2 MySQL 里的字符集和Collations

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

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 |

...

輸出實際上包含另一列,這里為了讓例子在頁面上顯示更合適,沒顯示出來

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

要列出一個字符集的 collations , 使用 SHOW COLLATION 語句. 例如, 要看latin1

(``ISO-8859-1 West European'')的collations, 使用這個語句來找到哪些名字以latin1

開頭的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 有這些一般特性:

·兩個不同字符集沒法擁有同一個collation.

·每個字符集有一個默認 collation. 例如, latin1 的默認 collation 是

latin1_swedish_ci.

·collation 的命名有個約定: 他們由所關(guān)聯(lián)的字符集的名字打頭,他們通常包含一個

語言名, 并以 _ci (case insensitive大小寫不敏感),

或者 _cs (case sensitive大小寫敏感), 或者 _bin (binary二進制).

10.3 決定默認字符集和 Collation

有四個級別上的默認字符集和collation設(shè)置: 服務(wù)器,數(shù)據(jù)庫,表和連接。下面的描述

可能看起來復(fù)雜,不過實踐中得出多級默認設(shè)置可以帶來自然而然的結(jié)果。

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

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

MySQL 這樣決定服務(wù)器級的字符集和collation

·當服務(wù)器開始按照有效選項設(shè)置

·運行期間按照變量

在服務(wù)器級別,決定是很簡單的,依靠你執(zhí)行mysqld時使用的選項來決定服務(wù)器字符集

和collation。你可以使用--default-character-set 來指定字符集,并且和這個一起

還可以為collation加上--default-collation 。如果你不指定字符集,就相當于說

--default-character-set=latin1。如果你只指定了字符集(例如,latin1)但是沒有指定

collation,就相當于

--default-charset=latin1 --default-collation=latin1_swedish_ci

因為 latin1_swedish_ci是latin1字符集的默認collation, 因此下面三個命令都具有

同樣效果:

shell> mysqld

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

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

--default-collation=latin1_swedish_ci

有個改變這個設(shè)置的方法是重新編譯,如果你想編譯源碼來改變默認的服務(wù)器字符集和

collation,在configure使加上參數(shù)--with-charset 和 --with-collation ,例如:

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

或者:

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

mysqld 和configure 都會核實字符集/collation的結(jié)合是否有效,如果無效,這兩個

程序都會報錯并中止。

現(xiàn)行服務(wù)器字符集和collation 是和character_set_server 和 collation_server

這兩個系統(tǒng)變量的值一樣,這些變量可以在運行時更改

10.3.2 數(shù)據(jù)庫字符集和 Collation

每個數(shù)據(jù)庫都有一個數(shù)據(jù)庫字符集和數(shù)據(jù)庫collation,并且不能為空,CREATE DATABASE

和 ALTER DATABASE 語句有專門指明數(shù)據(jù)庫字符集和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可以這樣選擇數(shù)據(jù)庫字符集和數(shù)據(jù)庫collation:

·如果 CHARACTER SET X 和 COLLATE Y 被指定了, 那么字符集是 X collation 是 Y.

·如果 CHARACTER SET X 被指定,但是沒有指定 COLLATE, 那么字符集是 X collation

是默認collation.

·否則, 就用服務(wù)器字符集和服務(wù)器 collation.

MySQL 的 CREATE DATABASE ... DEFAULT CHARACTER SET ... 語法類似于標準 SQL

的 CREATE SCHEMA ... CHARACTER SET ... 語法. 因為這樣, 就可能在同一個MySQL

服務(wù)器上創(chuàng)建具有不同字符集和collation的數(shù)據(jù)庫。

如果在建表的語句里沒有指定表的字符集和collation,那么數(shù)據(jù)庫字符集和 collation

就作為表的字符集和collation的默認值. 它們沒有別的作用。

默認數(shù)據(jù)庫的字符集和 collation是和 character_set_database 以及

collation_database 這兩個系統(tǒng)變量的值一樣。 當默認數(shù)據(jù)庫更改時服務(wù)程序會設(shè)置

這些變量的值。如果沒有默認數(shù)據(jù)庫, 變量的值會和配套的服務(wù)器級系統(tǒng)變量

character_set_server 以及 collation_server的值一致.

10.3.3 表字符集和 Collation

每個表有一個表字符集以及一個表collation,不能為空。CREATE TABLE 和 ALTER TABLE

語句有可選子句指定表字符集和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 通過下面的方法選擇表字符集和collation:

·如果 CHARACTER SET X 和 COLLATE Y 都被指定了, 那么字符集就是 X collation 是Y

·如果只指定了CHARACTER SET X 而沒有指定 COLLATE, 那么字符集為 X 并配默認的

collation.

·否則就使用數(shù)據(jù)庫字符集和 collation.

表字符集和 collation 用來在沒有指定個別列字符集和列collation的時候做為它們

的默認值。表字符集和 collation 是MySQL 的擴展;在標準SQL里沒有這種東西

10.3.4 列字符集和 Collation

每個``character'' 列(是指列屬性為CHAR, VARCHAR, 或 TEXT的)都有一個列字符集

和一個列collation,不能為空。列定義語句有可選子句指定列字符集和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 但沒有指定 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;

這里我們有一個用latin1的字符集和latin1_german1_ci collation的列。

定義非常明顯,所以很簡單。注意把一個latin1 的列存到一個latin2的表里不會有問題

例子2:表+列定義

CREATE TABLE t1

(

c1 CHAR(10) CHARACTER SET latin1

) DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;

這次我們有一列是latin1字符集加默認的collation。現(xiàn)在,雖然它看上去很自然,

但是默認的collation卻不是從表級繼承而來。事實上,因為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;

我們有一個默認字符集和默認collation的列。在這個環(huán)境下,MySQL向上到表級決定

列字符集和collation。所以,c1的列字符集是latin1,它的collation是

latin1_danish_ci

例子4:數(shù)據(jù)庫+表+列定義

CREATE DATABASE d1

DEFAULT CHARACTER SET latin2 COLLATE latin2_czech_ci;

USE d1;

CREATE TABLE t1

(

c1 CHAR(10)

);

我們創(chuàng)建了一個沒有指定列字符集和collation的列。我們也沒有指定表級字符集和

collation。在這個條件下,MySQL向上到數(shù)據(jù)庫級決定。(數(shù)據(jù)庫的設(shè)置變?yōu)楸淼脑O(shè)置,

之后成為列的設(shè)置),所以c1的列字符集是latin2,collation是latin2_czech_ci

10.3.6 連接的字符集和Collations

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

·服務(wù)器的字符集和collation和 character_set_server 及 collation_server 變量

的值一樣

·默認數(shù)據(jù)庫的字符集和collation和 character_set_database 及 collation_database

變量的值一樣.

附加的字符集和collation 變量被引入用來處理服務(wù)器和客戶端之間連接得通信。每個

客戶端都有連接相關(guān)的字符集和collation變量。

想想“連接”是什么:是你連到服務(wù)器時作的事情。客戶端通過這條連接發(fā)送SQL語句,

比如查詢,服務(wù)器則通過這條連接給客戶端送回回應(yīng),比如查詢結(jié)果結(jié)果集合,這導(dǎo)致

了客戶端處理字符集和collation的一些問題,它們每個都可以按照系統(tǒng)變量來回答:

·當查詢離開客戶端的時候應(yīng)該是什么字符集的?服務(wù)器用character_set_client

這個變量來作為客戶端發(fā)送查詢所用的字符集

·服務(wù)器端在接收到了查詢以后應(yīng)該把它翻譯到社么字符集里?對于這個,服務(wù)程序

用的是character_set_connection 和 collation_connection 這兩個變量。

它把客戶端送來的查詢從character_set_client 轉(zhuǎn)換成character_set_connection

(除了latin1或者utf8 的字符串)。collation_connection 對于比較字符串非常

重要,對于列值比較字符串是沒有關(guān)系的,因為列擁有高優(yōu)先級

·當服務(wù)程序要送回結(jié)果集合或者錯誤信息給客戶端時應(yīng)該用什么字符集?

character_set_results 變量指示了這個值,這包括了列值,或者列名等結(jié)果數(shù)據(jù)。

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

有兩個語句影響連接字符集設(shè)置:

SET NAMES 'charset_name'

SET CHARACTER SET charset_name

SET NAMES 指出客戶端送出的SQL語句里是什么。因此,SET NAMES 'cp1251' 就告訴服務(wù)

程序“下面將要從這個客戶端送來的信息將是使用'cp1251'這個字符集。這也指定了

服務(wù)程序送回的結(jié)果所用的字符集,(例如如果你用了一個SELECT語句它會指出列值

擁有的字符集)

SET NAMES 'x' 語句相當于下面三個語句:

mysql> SET character_set_client = x;

mysql> SET character_set_results = x;

mysql> SET character_set_connection = x;

把character_set_connection 設(shè)置成x也會把collation_connection 設(shè)置成默認

collation x

SET CHARACTER SET 是類似的,不過是把連接字符集和collation設(shè)置成那些默認數(shù)據(jù)庫。

SET CHARACTER SET x 語句相當于這三個語句:

mysql> SET character_set_client = x;

mysql> SET character_set_results = x;

mysql> SET collation_connection = @@collation_database;

當一個客戶連接,它向服務(wù)程序發(fā)送它想使用的字符集的名字,服務(wù)程序把

character_set_client, character_set_results, 和 character_set_connection

這些變量設(shè)置成那個字符集(事實上,服務(wù)程序使用字符集執(zhí)行了SET NAMES 操作)

如果你不想用默認字符集,使用 Mysql 客戶端程序不需要每次啟動時執(zhí)行SET NAMES 。

你可以在mysql 執(zhí)行語句行加上--default-character-set 這個選項,或者在你的選項

文件里加上。比如,下面的選項文件設(shè)置使你每次執(zhí)行mysql程序時把默認字符集變量

改成 koi8r:

[mysql]

default-character-set=koi8r

例如:假設(shè)column1定義是 CHAR(5) CHARACTER SET latin2。如果你不用SET NAMES

或者 SET CHARACTER SET,那么對于你的 SELECT column1 FROM t 請求,服務(wù)程序

會把column1 的所有值用連接建立時客戶端指定的字符集來回送。另一方面,如果你

用了 SET NAMES 'latin1' or SET CHARACTER SET latin1 ,那么在送回結(jié)果之前,

服務(wù)程序會把 latin2 的值轉(zhuǎn)成latin1,如果里面有兩種字符集里都沒有的字符,

轉(zhuǎn)化會有損耗。

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

mysql> SET character_set_results = NULL;

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

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

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

[_charset_name]'string' [COLLATE collation_name]

例如:

SELECT 'string';

SELECT _latin1'string';

SELECT _latin1'string' COLLATE latin1_danish_ci;

對于簡單語句 SELECT 'string',字符串的字符集和collation是由兩個系統(tǒng)變量

character_set_connection 和 collation_connection 定義的。

_charset_name 表達式正式情況下被叫做 introducer .它告訴分析器“下面的字符串

是使用 X 字符集的。”因為這在以前造成很多人的困擾,我們強調(diào)一下introducer

并不作任何轉(zhuǎn)換,嚴格來講并不改變字符串的值,只是一個符號。introducer 在

標準16進制文字前和數(shù)字16進制記法前都是合法的(x'literal' 和 0xnnnn),

在?前面也是合法的(當在程序設(shè)計語言接口里使用預(yù)備語句時作參數(shù)替換)

例如:

SELECT _latin1 x'AABBCC';

SELECT _latin1 0xAABBCC;

SELECT _latin1 ?;

MySQL 這樣決定一個文字的字符集和collation:

·如果 _X 和 COLLATE Y 都被指定了,那么字符集就是 X collation 是 Y

·如果 指定了 _X 而沒有指定 COLLATE ,那么字符集是 X collation 是 X 的默認

collation

·否則,由系統(tǒng)變量 character_set_connection 和 collation_connection 決定字符集

和collation

例如:

·一個字符集是 latin1 而collation是 latin1_german1_ci 的字符串:

SELECT _latin1'Müller' COLLATE latin1_german1_ci;

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

SELECT _latin1'Müller';

·一個連接默認字符集和collation的字符串:

SELECT 'Müller';

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

10.3.8. 在 SQL 語句里使用 COLLATE

通過 COLLATE 子句,你可以在比較時覆蓋替換掉任何默認collation, COLLATE 可以用

在SQL 語句的很多部分里,這里是一些例子:

·在 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;

·在集合函數(shù)里:

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 之間比較列的時候能夠避免出錯信息。

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

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

x || y COLLATE z

x || (y COLLATE z)

10.3.10. BINARY 運算

BINARY 運算是COLLATE 子句的速記法,BINARY 'x' 和 'x' COLLATE y 是相同的,

y 是字符集 'x' 的二元collation 的名字。每個字符集都有二元 collation。例如,

latin1 字符集的 collation 是latin1_bin,所以如果列 a 是latin1 字符集,下面

兩個語句有同樣效果:

SELECT * FROM t1 ORDER BY BINARY a;

SELECT * FROM t1 ORDER BY a COLLATE latin1_bin;

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

在絕大多數(shù)查詢里,MySQL 用什么collation來進行比較操作都是很顯而易見的,例如,

在下面的情況里,很顯然collation 應(yīng)該是“列 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';

這個查詢應(yīng)該使用列 x 的collation 呢,還是使用字符串'Y' 的?

標準SQL 使用被叫做``coercibility'' 的規(guī)則來解決這個問題。本質(zhì)就是:因為

x 和 'Y' 都有collation ,優(yōu)先使用誰的collation呢?這很復(fù)雜,不過下面的規(guī)則能

應(yīng)付大多數(shù)情況:

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

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

·一個列的 collation 的 coercibility 是 2

·一個文字型的collation 的 coercibility 是3。

那些規(guī)則這樣解決含混:

·使用具有最低 coercibility 值的collation

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

例如:

column1 = 'A' 使用column1的collation

column1 = 'A' COLLATE x 使用 'A' 的collation

column1 COLLATE x = 'A' COLLATE y Error

COERCIBILITY() 函數(shù)可以用來判斷一個字符串表達式的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

對于數(shù)據(jù)庫引擎來說顯而易見的排序并不是總那么顯而易見(version 4.1).

一個沒有帶類似于"select concat(mycolumn, '%') from mytable "這樣的排序指令

的查詢在"mycolumn" 和"%"的字符集不相同的情況下不會工作。

在我這里,整個數(shù)據(jù)庫使用 UTF-8, 默認情況下, '%' 假設(shè)是 latin1,

causing an error to be triggered。

10.3.12. Collations Must Be for the Right Character Set

記得說過每個字符集都有一個或者多個collation,每個collation只和一個字符集關(guān)聯(lián)。

因此,下面的語句會導(dǎo)致錯誤,因為 latin2_bin 這個collation 和 latin1 這個字符集

不配套。

mysql> SELECT _latin1 'x' COLLATE latin2_bin;

ERROR 1251: COLLATION 'latin2_bin' is not valid

for CHARACTER SET 'latin1'

在某些情況下,在 MySQL 4.1 前工作的表達式會在MySQL 4.1以后的版本失敗,

如果你在帳號里沒有字符集和collation的話。例如,在 MySQL 4.1 前,這個語句

會這樣工作:

mysql> SELECT SUBSTRING_INDEX(USER(),'@',1);

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

| SUBSTRING_INDEX(USER(),'@',1) |

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

| root |

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

升級到MySQL 4.1 以后,語句失效:

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ā)生這個的原因是username 使用utf8存儲(參看10.6節(jié)),因此, USER() 函數(shù)

和文字型字符串'@'具有不同的字符集(當然也是不同collation):

mysql> SELECT COLLATION(USER()), COLLATION('@');

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

| COLLATION(USER()) | COLLATION('@') |

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

| utf8_general_ci | latin1_swedish_ci |

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

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

mysql> SELECT SUBSTRING_INDEX(USER(),_utf8'@',1);

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

| SUBSTRING_INDEX(USER(),_utf8'@',1) |

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

| root |

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

另一個方法是把連接的字符集和collation改成utf8,你可以使用SET NAMES 'utf8'

或者直接設(shè)置兩個系統(tǒng)變量character_set_connection 和 collation_connection

的值來達到這個目的。

10.3.13. Collation 的效果的一個例子

假設(shè)表 T 里的列 X 具有這些 latin1 的列值:

Muffler

Müller

MX Systems

MySQL

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

SELECT X FROM T ORDER BY X COLLATE collation_name;

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

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

這張表顯示了如果我們在一個 ORDER BY 子句里使用不同collation 會有什么樣的效果

的例子,導(dǎo)致這種不同排序結(jié)果的字符是上面有兩個點的 U,在德語里叫做U-曲音,

不過我們叫做U-分音符

·第一列顯示了使用瑞典/芬蘭 collation 規(guī)則的 SELECT 的結(jié)果,U-分音符

通過Y歸類

·第二列顯示了使用德語DIN-1 規(guī)則的SELECT 語句的結(jié)果,U-分音符通過U歸類

·第三列顯示了使用德語DIN-2 規(guī)則的SELECT 語句的結(jié)果,U-分音符通過UE歸類

三種不同的collation ,三種不同的結(jié)果,這是MySQL 在這里的處理。通過使用合適的

collation,你可以選擇你想要的排序次序。

該文章轉(zhuǎn)載自宋氏電腦 技術(shù)無憂:http://www.pc51.org/data/MySQL/2007-01-04/2600.html

總結(jié)

以上是生活随笔為你收集整理的mysql collation utf8_mysql数据库 表字段 的collation utf8_unicode_ci的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 超碰97人人干| 国产精品久热 | 亚洲一区二区黄色 | 91香蕉视频在线观看免费 | 国产精品免费网站 | 免费成人看视频 | 91国内精品野花午夜精品 | 黄视频在线免费看 | 亚洲av永久无码精品 | 亚欧洲精品在线视频免费观看 | 香港一级淫片免费放 | 亚洲jlzzjizz少妇 | 与亲女洗澡时伦了毛片 | 日韩有码在线播放 | 欧美日韩不卡视频 | 男生舔女生的屁股 | 萌白酱在线观看 | 欧美午夜久久久 | 美女诱惑一区 | 亚洲第四页 | 天天做天天操 | 亚洲欧美自拍另类 | 亚洲石原莉奈一区二区在线观看 | 久久久com| 91欧美国产 | 校园春色中文字幕 | 麻豆91精品91久久久 | 人妻无码中文字幕免费视频蜜桃 | jizz在亚洲 | 玉足脚交榨精h文 | 国产精品人人妻人人爽 | 亚洲女同二女同志 | 少妇日韩 | 肥熟女一区二区三肥熟女 | 日韩欧美一区在线观看 | 全国男人的天堂网 | 日韩不卡 | 日日夜操 | 69视频在线播放 | 日韩免费 | 欧美黑人三级 | 亚洲国产精品久久久久爰性色 | 日韩在线第三页 | 国产精品无码成人片 | 国产精品久久久久久久久久 | 亚洲午夜av在线 | 成人做爰黄 | 欧美性极品xxxx做受 | 国产免费成人 | 国产精品ww| 男人操女人的视频 | 天天躁狠狠躁 | 亚洲国产www| 亚洲天堂视频在线 | 少妇熟女高潮流白浆 | 亚洲另类在线观看 | 香蕉久久一区二区三区 | 国产精品白嫩极品美女视频 | 久久系列| 亚洲成人一区在线 | 97精品人妻一区二区 | 少妇xxxx| 欧美色图国产精品 | 色婷婷综合久久久久中文一区二区 | 欧美夫妻性生活视频 | 久久无毛| www.一级片 | 国产二级毛片 | 国产精品天天狠天天看 | 日韩一级 | 亚洲AV无码精品黑人黑人 | 天堂网ww | 王者后宫yin肉h文催眠 | 91av在线视频播放 | 欧美一区二区三区免费观看 | 久久av资源 | 成人精品久久 | 猛男大粗猛爽h男人味 | 曰曰操| 香蕉伊思人视频 | 亚洲精品丝袜 | 国产精品白嫩白嫩大学美女 | 亚洲av综合av一区二区三区 | 毛片网站在线 | 69人人 | 四虎国产精品永久在线国在线 | 人物动物互动39集免费观看 | 图片区视频区小说区 | 女生喷液视频 | 欧美日韩一二三四 | mm1313亚洲国产精品美女 | 久久久久看片 | 日韩在线一二三区 | 懂色av蜜臀av粉嫩av分享吧最新章节 | 免费aa视频| 国产不卡在线 | av成人免费在线观看 | 人人操在线播放 | 欧美日韩国产一区二区三区在线观看 |