Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


10.1.8 文字列のレパートリー

文字セットのレパートリーとは、そのセット内の文字の集合です。

文字列式にはレパートリー属性があり、その値は次の 2 つです。

  • ASCII: U+0000 から U+007F の Unicode 範囲内の文字だけを式に含めることができます。

  • UNICODE: U+0000 から U+FFFF の Unicode 範囲内の文字を式に含めることができます。

ASCII 範囲は UNICODE 範囲のサブセットであるので、ASCII レパートリーの文字列は、UNICODE レパートリーの文字列の文字セットに、または ASCII のスーパーセットである文字セットに、情報を失うことなく安全に変換できます。(すべての MySQL 文字セットは、スウェーデン語のアクセント符号付き文字に一部の句読点文字を再使用する swe7 を除き、ASCII のスーパーセットです。)MySQL から照合順序の不正な混在エラーが返されるような多くの場合でも、レパートリーを使用すると、式内の文字セットを変換できます。

次の説明では、式とそのレパートリーの例を挙げ、レパートリーの使用によって、文字列式の評価がどのように変わるかを示します。

  • 文字列定数のレパートリーは、文字列の内容に応じて異なります。

    SET NAMES utf8; SELECT 'abc';
    SELECT _utf8'def';
    SELECT N'MySQL';
    

    前述のそれぞれの場合では文字セットは utf8 ですが、実際には ASCII 範囲外の文字は 1 つも文字列に含まれていないので、そのレパートリーは UNICODE ではなく ASCII です。

  • ascii 文字セットを含むカラムには、その文字セットのために、ASCII レパートリーがあります。次のテーブルでは、c1 には ASCII レパートリーがあります。

    CREATE TABLE t1 (c1 CHAR(1) CHARACTER SET ascii);
    

    次の例では、レパートリーがないときにエラーが発生する場合に、レパートリーによってどのように結果が求められるようになるかを示しています。

    CREATE TABLE t1 (
      c1 CHAR(1) CHARACTER SET latin1,
      c2 CHAR(1) CHARACTER SET ascii
    );
    INSERT INTO t1 VALUES ('a','b');
    SELECT CONCAT(c1,c2) FROM t1;
    

    レパートリーがない場合、次のエラーが発生します。

    ERROR 1267 (HY000): Illegal mix of collations (latin1_swedish_ci,IMPLICIT)
    and (ascii_general_ci,IMPLICIT) for operation 'concat'
    

    レパートリーを使用すると、サブセットからスーパーセットへ (ascii から latin1 へ) の変換を行うことができ、結果が返されます。

    +---------------+
    | CONCAT(c1,c2) |
    +---------------+
    | ab            |
    +---------------+
    
  • 1 つの文字列引数を持つ関数は、その引数のレパートリーを継承します。UPPER(_utf8'abc') の場合、引数に ASCII レパートリーがあるので、その結果には ASCII レパートリーが存在します。

  • 文字列を返すが、文字列引数を持たず、結果文字セットとして character_set_connection を使用する関数の場合、結果のレパートリーは、character_set_connectionascii である場合は ASCII に、それ以外の場合は UNICODE になります。

    FORMAT(numeric_column, 4);
    

    レパートリーを使用するかどうかによって、MySQL が次の例をどのように評価するかが変わります。

    SET NAMES ascii;
    CREATE TABLE t1 (a INT, b VARCHAR(10) CHARACTER SET latin1);
    INSERT INTO t1 VALUES (1,'b');
    SELECT CONCAT(FORMAT(a, 4), b) FROM t1;
    

    レパートリーがない場合、次のエラーが発生します。

    ERROR 1267 (HY000): Illegal mix of collations (ascii_general_ci,COERCIBLE)
    and (latin1_swedish_ci,IMPLICIT) for operation 'concat'
    

    レパートリーを使用すると、次のように結果が返されます。

    +-------------------------+
    | CONCAT(FORMAT(a, 4), b) |
    +-------------------------+
    | 1.0000b                 |
    +-------------------------+
    
  • 2 つ以上の文字列引数を持つ関数は、結果のレパートリーとして、もっとも範囲の広い引数レパートリーを使用します (UNICODEASCII よりも範囲が広くなります)。次の CONCAT() 呼び出しを考えてみます。

    CONCAT(_ucs2 0x0041, _ucs2 0x0042)
    CONCAT(_ucs2 0x0041, _ucs2 0x00C2)
    

    最初の呼び出しでは、両方の引数が ascii 文字セットの範囲内にあるので、レパートリーは ASCII です。2 番目の呼び出しでは、2 番目の引数が ascii 文字セット範囲外にあるので、レパートリーは UNICODE です。

  • 関数の戻り値のレパートリーは、結果の文字セットおよび照合順序に影響する引数のレパートリーにのみ基づいて定められます。

    IF(column1 < column2, 'smaller', 'greater')
    

    結果のレパートリーは、2 つの文字列引数 (2 番目の引数と 3 番目の引数) がどちらも ASCII レパートリーなので、ASCII です。最初の引数は、式で文字列値を使用する場合でも、結果のレパートリーにとっては重要ではありません。


User Comments
Sign Up Login You must be logged in to post a comment.