MariaDB字符集和排序规则(3)

默认情况下,字符集和排序规则通过系统变量character_set_connection和collation_connection来决定使用的字面符号。但是可以显式地指定它们:

[_charset_name]'string' [COLLATE collation_name]

对于没有字符集introducer的字符集来说,它的字符串符号由系统变量character_set_connection决定。

该查询:

SELECT CHARSET('a'), @@character_set_connection;

总是会为两列返回相同的字符集名称。

character_set_client和character_set_connection一般会被设置为相同的值(例如在三次握手期间,或使用SET NAMES进行了设置)。但允许设置为不同值。

示例

设置@@character_set_client和@@character_set_connection为不同的值时可能很有用处:

示例 1:

假设我们在utf8的数据库中创建下面的表:

CREATE TABLE t1 (a VARCHAR(10)) CHARACTER SET utf8 COLLATE utf8_general_ci; INSERT INTO t1 VALUES ('oe'),('ö');

现在使用"mysql.exe"连接,它会使用DOS的字符集(西欧的机器上是cp850),如果想要根据德国电话簿规则获取等于"ö"的所有记录。

使用下面的语句:

SET @@character_set_client=cp850, @@character_set_connection=utf8; SELECT a FROM t1 WHERE a='ö' COLLATE utf8_german2_ci;

它将返回:

+------+ | a | +------+ | oe | | ö | +------+

工作方式如下:

客户端使用cp850发送查询语句。

服务端解析查询语句时,将把'ö'从@@character_set_client (cp850)转换为@@character_set_connection (utf8)的文本字符。

服务端对该文本字符应用排序规则"utf8_germal2_ci"。

服务端使用utf8_german2_ci进行字符比较。

注意,如果重写为如下脚本:

SET NAMES cp850; SELECT a FROM t1 WHERE a='ö' COLLATE utf8_german2_ci;

将报错:

ERROR 1253 (42000): COLLATION 'utf8_german2_ci' is not valid for CHARACTER SET 'cp850'

因为:

在第2步中,将不会转换为utf8的文本字符,而是转换为cp850的文本字符。

在第3步中,服务端无法对cp850的字符串应用排序规则utf8_german2_ci。

示例 2:

继续假设我们的数据库为utf8,并使用西欧机器上的"mysql.exe"进行连接。

我们这样做:

SET @@character_set_client=cp850, @@character_set_connection=utf8; CREATE TABLE t2 AS SELECT 'ö';

这将会创建一张包含VARCHAR(1) CHARACTER SET utf8字段类型的表。

注意,如果查询重写为:

SET NAMES cp850; CREATE TABLE t2 AS SELECT 'ö';

创建的表中的字段将为VARCHAR(1) CHARACTER SET cp850类型,这可能不是我们所期望的。

N

同样, 可以使用前缀N或n来转换文本字符为国际字符集(MariaDB中为utf8)。

例如:

SELECT _latin2 'Müller'; +-----------+ | MĂźller | +-----------+ | MĂźller | +-----------+ SELECT CHARSET(N'a string'); +----------------------+ | CHARSET(N'a string') | +----------------------+ | utf8 | +----------------------+ SELECT 'Mueller' = 'Müller' COLLATE 'latin1_german2_ci'; +---------------------------------------------------+ | 'Mueller' = 'Müller' COLLATE 'latin1_german2_ci' | +---------------------------------------------------+ | 1 | +---------------------------------------------------+ 存储过程和视图

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/42a550b8bd2ae305e4ff40f9bdb529f0.html