• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 在SQL语句中校验字符集

    字符串文字,十六进制文字或位值文字可以具有可选的字符集介绍程序和COLLATE子句,以将其指定为使用特定字符集和校验规则的字符串:

    [_charset_name] literal [COLLATE collation_name]
    

    该表达式正式称为校验。它告诉解析器,“其后的字符串使用字符集。”导引器不会改变像串介绍人字符集会做。尽管可能会发生填充,但它不会更改字符串值。引入器只是一个信号。_charset_namecharset_nameCONVERT()

    对于字符串文字,引入程序和字符串之间的空格是允许的,但是可选的。

    对于字符集文字,介绍程序会指示以下字符串的字符集,但不会更改解析器在字符串内执行转义处理的方式。解析器始终根据给出的字符集来解释转义character_set_connection。有关其他讨论和示例,请参见“字符串字符集和校验规则”。

    例子:

    SELECT 'abc';
    SELECT _latin1'abc';
    SELECT _binary'abc';
    SELECT _utf8mb4'abc' COLLATE utf8mb4_danish_ci;
    
    SELECT _latin1 X'4D7953514C';
    SELECT _utf8mb4 0x4D7953514C COLLATE utf8mb4_danish_ci;
    
    SELECT _latin1 b'1000001';
    SELECT _utf8mb4 0b1000001 COLLATE utf8mb4_danish_ci;
    

    字符集介绍程序和COLLATE子句是根据标准SQL规范实现的。

    可以使用_binary介绍程序将字符串文字指定为二进制字符串。十六进制文字和位值文字默认情况下为二进制字符串,因此_binary是允许的,但通常是不必要的。_binary将十六进制或位文字保留为二进制字符串可能会很有用,否则会将文字视为数字。例如,位操作允许在MySQL 8.0及更高版本中使用数字或二进制字符串参数,但默认情况下将十六进制和位文字视为数字。要为此类文字明确指定二进制字符串上下文,请_binary对至少一个参数使用一个引言:

    mysql> SET @v1 = X'000D' | X'0BC0';
    mysql> SET @v2 = _binary X'000D' | X'0BC0';
    mysql> SELECT HEX(@v1), HEX(@v2);
    +----------	+----------	+
    | HEX(@v1) 	| HEX(@v2) 	|
    +----------	+----------	+
    | BCD      	| 0BCD     	|
    +----------	+----------	+
    

    对于两个位操作,显示的结果看起来都相似,但是不带结果_binary是一个BIGINT值,而带结果_binary是一个二进制字符串。由于结果类型的不同,显示的值也不同:数字结果不显示高阶0位数。

    MySQL通过以下方式确定字符串文字,十六进制文字或位值文字的字符集和校验规则:

    • 如果同时_charset_name和指定,字符集和校验规则使用。必须是的允许校验规则。COLLATE collation_namecharset_namecollation_namecollation_namecharset_name
    • 如果_charset_name指定但未COLLATE指定,charset_name则使用字符集及其默认校验规则。要参见每个字符集的默认校验规则,请使用SHOW CHARACTER SET语句或查询INFORMATION_SCHEMACHARACTER_SETS表。
    • 如果_charset_name未指定,但已指定:COLLATE collation_name

      • 对于字符串文字,使用character_set_connection系统变量和校验规则给定的连接默认字符集collation_namecollation_name必须是连接默认字符集的允许校验规则。
      • 对于十六进制文字或位值文字,唯一允许的归类是binary因为默认情况下这些文字类型是二进制字符串。
    • 否则(_charset_name未指定):COLLATE collation_name

      • 对于字符串文字,将使用character_set_connectioncollation_connection系统变量给出的连接默认字符集和校验规则。
      • 对于十六进制文字或位值文字,字符集和校验规则为binary

    例子:

    • 具有latin1字符集和latin1_german1_ci校验规则的非二进制字符串:

      SELECT _latin1'Müller' COLLATE latin1_german1_ci;
      SELECT _latin1 X'0A0D' COLLATE latin1_german1_ci;
      SELECT _latin1 b'0110' COLLATE latin1_german1_ci;
      
    • 具有utf8mb4字符集及其默认校验规则(即utf8mb4_0900_ai_ci)的非二进制字符串:

      SELECT _utf8mb4'Müller';
      SELECT _utf8mb4 X'0A0D';
      SELECT _utf8mb4 b'0110';
      
    • 具有binary字符集及其默认校验规则(即binary)的二进制字符串:

      SELECT _binary'Müller';
      SELECT X'0A0D';
      SELECT b'0110';
      

      十六进制文字和位值文字不需要引入符,因为默认情况下它们是二进制字符串。

    • 具有连接默认字符集和utf8mb4_general_ci校验规则的非二进制字符串(如果连接字符集不是,则失败utf8mb4):

      SELECT 'Müller' COLLATE utf8mb4_general_ci;
      

      此构造(COLLATE仅)不适用于十六进制文字或位文字,因为它们的字符集binary与连接字符集无关,并且binaryutf8mb4_general_ci校验规则不兼容。COLLATE在没有介绍人的情况下,唯一允许的子句是COLLATE binary

    • 具有连接默认字符集和校验规则的字符串:

      SELECT 'Müller';