リテラル値
TiDBリテラル値には、文字リテラル、数値リテラル、日時リテラル、16進数、2進数リテラル、およびNULLリテラルが含まれます。このドキュメントでは、これらのリテラル値のそれぞれを紹介します。
このドキュメントでは、文字列リテラル、数値リテラル、NULL値、16進リテラル、日付と時刻のリテラル、ブール値リテラル、およびビット値リテラルについて説明します。
文字列リテラル
文字列は、バイトまたは文字のシーケンスであり、一重引用符'文字または二重引用符"文字で囲まれています。例えば:
'example string'
"example string"
隣り合って配置された引用符で囲まれた文字列は、1つの文字列に連結されます。次の行は同等です。
'a string'
'a' ' ' 'string'
"a" ' ' "string"
ANSI_QUOTES SQL MODEが有効になっている場合、二重引用符で囲まれた文字列は識別子として解釈されるため、文字列リテラルは一重引用符でのみ引用できます。
文字列は、次の2つのタイプに分けられます。
- バイナリ文字列:バイトのシーケンスで構成され、文字セットと照合順序は両方とも
binaryであり、互いに比較するとバイトを単位として使用します。 - 非バイナリ文字列:文字のシーケンスで構成され、
binary以外のさまざまな文字セットと照合があります。互いに比較すると、非バイナリ文字列は文字を単位として使用します。文字セットによっては、文字に複数のバイトが含まれる場合があります。
文字列リテラルには、特定の文字セットと照合順序を使用する文字列として指定するために、オプションの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'、'SS''HH:MM:SS''D HH:MM'は'D HH'D意味し、有効な値の範囲は'HH:MM'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進リテラルは2進文字列です。
文字列または数値を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を使用して書き込まれた2進値です。先頭の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と同じではなく、空の文字列''でもありません。