リテラル値
TiDB リテラル値には、文字リテラル、数値リテラル、時刻および日付リテラル、16 進数、バイナリ リテラル、および NULL リテラルが含まれます。このドキュメントでは、これらの各リテラル値を紹介します。
このドキュメントでは、文字列リテラル、数値リテラル、NULL 値、16 進リテラル、日付と時刻のリテラル、ブール型リテラル、およびビット値リテラルについて説明します。
文字列リテラル
文字列は、一重引用符'または二重引用符"の文字で囲まれた一連のバイトまたは文字です。例えば:
'example string'
"example string"
隣り合って配置された引用符で囲まれた文字列は 1 つの文字列に連結されます。次の行は同等です。
'a string'
'a' ' ' 'string'
"a" ' ' "string"
ANSI_QUOTES SQL MODE が有効な場合、二重引用符で囲まれた文字列は識別子として解釈されるため、文字列リテラルは一重引用符内でのみ引用できます。
文字列は次の 2 種類に分類されます。
- バイナリ文字列: 文字セットと照合順序順序が両方とも
binaryである一連のバイトで構成され、相互に比較する際の単位としてバイトを使用します。 - 非バイナリ文字列: 一連の文字で構成され、 
binary以外のさまざまな文字セットと照合順序があります。相互に比較する場合、非バイナリ文字列は単位として文字を使用します。文字セットによっては、1 つの文字に複数のバイトが含まれる場合があります。 
文字列リテラルには、特定の文字セットと照合順序を使用する文字列として指定するために、オプションのcharacter set introducerとCOLLATE clauseを指定できます。
[_charset_name]'string' [COLLATE collation_name]
例えば:
SELECT _latin1'string';
SELECT _binary'string';
SELECT _utf8'string' COLLATE utf8_bin;
N'literal' (または n'literal') を使用して、各国語文字セットの文字列を作成できます。次のステートメントは同等です。
SELECT N'some text';
SELECT n'some text';
SELECT _utf8'some text';
文字列内の一部の特殊文字を表すには、エスケープ文字を使用してエスケープできます。
| エスケープ文字 | 意味 | 
|---|---|
| \0 | ASCII NUL (X'00') 文字 | 
| \' | シングルクォーテーション'文字 | 
| 「 | ダブルクォーテーション"文字 | 
| \b | バックスペース文字 | 
| \n | 改行 (改行) 文字 | 
| \r | キャリッジリターン文字 | 
| \t | タブ文字 | 
| \z | ASCII 26 (Ctrl + Z) | 
| \ | バックスラッシュ\文字 | 
| \% | %文字 | 
| _ | _文字 | 
'で囲まれた文字列で"を表したい場合、または"で囲まれた文字列で'表したい場合は、エスケープ文字を使用する必要はありません。
詳細については、 MySQL の文字列リテラルを参照してください。
数値リテラル
数値リテラルには、整数リテラル、DECIMAL リテラル、および浮動小数点リテラルが含まれます。
整数には、小数点として.が含まれる場合があります。数字の前に-または+を付けて、それぞれ負の値または正の値を示すことができます。
正確な値の数値リテラルは1, .2, 3.4, -5, -6.78, +9.10として表すことができます。
数値リテラルは、 1.2E3, 1.2E-3, -1.2E3, -1.2E-3などの科学的表記法で表すこともできます。
詳細については、 MySQL の数値リテラルを参照してください。
日付と時刻のリテラル
日付と時刻のリテラル値は、引用符で囲まれた文字列や数値など、いくつかの形式で表すことができます。 TiDB が日付を期待する場合、 '2017-08-24' 、 '20170824' 、および20170824のいずれかを日付として解釈します。
TiDB は次の日付形式をサポートしています。
'YYYY-MM-DD'または'YY-MM-DD': ここでの-区切り文字は厳密ではありません。任意の句読点を使用できます。たとえば、'2017-08-24'、'2017&08&24'、'2012@12^31'はすべて有効な日付形式です。唯一の特別な句読点は「.」で、これは整数部分と小数部分を区切るための小数点として扱われます。日付と時刻はTまたは空白で区切ることができます。たとえば、2017-8-24 10:42:00と2017-8-24T10:42:00同じ日付と時刻を表します。'YYYYMMDDHHMMSS'または'YYMMDDHHMMSS': たとえば、'20170824104520'と'170824104520'は'2017-08-24 10:45:20'とみなされます。ただし、'170824304520'などの範囲外の値を指定した場合、それは有効な日付として扱われません。YYYYMMDD HHMMSS、YYYYMMDD HH:MM:DD、またはYYYY-MM-DD HHMMSSなどの不正な形式は挿入に失敗することに注意してください。YYYYMMDDHHMMSSまたはYYMMDDHHMMSS: これらの形式には一重引用符や二重引用符はなく、数値が含まれることに注意してください。たとえば、20170824104520は'2017-08-24 10:45:20'として解釈されます。
DATETIME 値または TIMESTAMP 値の後には、マイクロ秒の精度 (6 桁) を表すために使用される小数部を続けることができます。小数部は常に小数点.で残りの時間から区切る必要があります。
2 桁のみの年の値はあいまいです。 4 桁の年の形式を使用することをお勧めします。 TiDB は、次の規則に従って 2 桁の年の値を解釈します。
- 年の値が
70-99の範囲にある場合は、1970-1999に変換されます。 - 年の値が
00-69の範囲にある場合は、2000-2069に変換されます。 
10 未満の月または日の値の場合、 '2017-8-4'は'2017-08-04'と同じです。時間についても同様です。たとえば、 '2017-08-24 1:2:3'は'2017-08-24 01:02:03'と同じです。
日付または時刻の値が必要な場合、TiDB は値の長さに応じて指定された形式を選択します。
- 6 桁: 
YYMMDD。 - 12 桁: 
YYMMDDHHMMSS. - 8 桁: 
YYYYMMDD。 - 14 桁: 
YYYYMMDDHHMMSS. 
TiDB は、時間値の次の形式をサポートしています。
'D HH:MM:SS'、または'HH:MM:SS'、'HH:MM'、'D HH:MM'、'D HH'、'SS':Dは日数を意味し、有効な値の範囲は0-34です。HHMMSS形式の数値: たとえば、231010は'23:10:10'として解釈されます。SS、MMSS、およびHHMMSSのいずれかの形式の数値を時間と見なすことができます。
Time 型の小数点も.で、小数点以下最大 6 桁の精度です。
詳細についてはMySQL の日付と時刻のリテラル参照してください。
ブールリテラル
定数TRUEとFALSEはそれぞれ 1 と 0 に等しく、大文字と小文字は区別されません。
SELECT TRUE, true, tRuE, FALSE, FaLsE, false;
+------+------+------+-------+-------+-------+
| TRUE | true | tRuE | FALSE | FaLsE | false |
+------+------+------+-------+-------+-------+
|    1 |    1 |    1 |     0 |     0 |     0 |
+------+------+------+-------+-------+-------+
1 row in set (0.00 sec)
16 進リテラル
16 進リテラル値はX'val'または0xval表記法を使用して記述され、 valには 16 進数が含まれます。先頭の0xは大文字と小文字が区別されるため、 0Xとして記述することはできません。
有効な 16 進リテラル:
X'ac12'
X'12AC'
x'ac12'
x'12AC'
0xac12
0x12AC
不正な 16 進リテラル:
X'1z' (z is not a hexadecimal legal digit)
0X12AC (0X must be written as 0x)
X'val'表記法を使用して記述された 16 進リテラルには、偶数の桁が含まれている必要があります。 valの長さが奇数の場合 (たとえば、 X'A'やX'11A' )、構文エラーを避けるために、値の先頭にゼロを埋め込みます。
mysql> select X'aff';
ERROR 1105 (HY000): line 0 column 13 near ""hex literal: invalid hexadecimal format, must even numbers, but 3 (total length 13)
mysql> select X'0aff';
+---------+
| X'0aff' |
+---------+
| 0x0aff  |
+---------+
1 row in set (0.00 sec)
デフォルトでは、16 進リテラルはバイナリ文字列です。
文字列または数値を 16 進形式の文字列に変換するには、 HEX()関数を使用します。
mysql> SELECT HEX('TiDB');
+-------------+
| HEX('TiDB') |
+-------------+
| 54694442    |
+-------------+
1 row in set (0.01 sec)
mysql> SELECT X'54694442';
+-------------+
| X'54694442' |
+-------------+
| TiDB        |
+-------------+
1 row in set (0.00 sec)
ビット値リテラル
ビット値リテラルは、 b'val'または0bval表記法を使用して記述されます。 val 0 と 1 を使用して書かれたバイナリ値です。先頭の0bは大文字と小文字が区別されるため、 0Bとして記述することはできません。
有効なビット値リテラル:
b'01'
B'01'
0b01
不正なビット値リテラル:
b'2' (2 is not a binary digit; it must be 0 or 1)
0B01 (0B must be written as 0b)
デフォルトでは、ビット値リテラルはバイナリ文字列です。
ビット値はバイナリ値として返されるため、MySQL クライアントでは適切に表示されない場合があります。ビット値を印刷可能な形式に変換するには、 BIN()やHEX()などの変換関数を使用できます。
CREATE TABLE t (b BIT(8));
INSERT INTO t SET b = b'00010011';
INSERT INTO t SET b = b'1110';
INSERT INTO t SET b = b'100101';
mysql> SELECT b+0, BIN(b), HEX(b) FROM t;
+------+--------+--------+
| b+0  | BIN(b) | HEX(b) |
+------+--------+--------+
|   19 | 10011  | 13     |
|   14 | 1110   | E      |
|   37 | 100101 | 25     |
+------+--------+--------+
3 rows in set (0.00 sec)
NULL 値
NULLデータが空であることを意味し、大文字と小文字が区別されません\N (大文字と小文字が区別される) と同義です。
ノート:
NULLは0や空の文字列''とは異なります。