默认情况下,字符集和排序规则通过系统变量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 | +---------------------------------------------------+ 存储过程和视图