SQLのvarcharについてまとめています。
SQLのvarcharは、文字列を格納するデータ型
以下はMySQLの例です。文字列を格納するデータ型にはvarchar以外にcharやtextがありますが、挙動に違いがあります。
textはキーに指定できませんし、データinsert時に末尾に空白が入るかどうかに違いがあります。
varchar(8)、char(8)、textの3つのデータ型を持つテーブルvchatestを作成し、”STR “(末尾に空白)という文字列をそれぞれのカラムにinsertしています。
charの場合は、末尾に空白の入る文字列だと、空白が削除されてしまうんですね。
// vchatestテーブルをcreate mysql> CREATE TABLE `employees`.`vchatest` ( `varchar_string` VARCHAR(8) NOT NULL , `char_string` CHAR(8) NOT NULL , `text_string` TEXT NOT NULL , PRIMARY KEY (`varchar_string`)) ; Query OK, 0 rows affected (0.11 sec) // vchatestテーブルの構造を確認 mysql> desc employees.vchatest; +----------------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------+------------+------+-----+---------+-------+ | varchar_string | varchar(8) | NO | PRI | NULL | | | char_string | char(8) | NO | | NULL | | | text_string | text | NO | | NULL | | +----------------+------------+------+-----+---------+-------+ 3 rows in set (0.03 sec) // vchatestにデータを1件挿入 mysql> INSERT INTO `employees`.`vchatest` (`varchar_string`, `char_string`, `text_string`) VALUES ('STR ', 'STR ', 'STR '); Query OK, 1 row affected (0.01 sec) // varchar、char、textで末尾に空白が入るかどうかに違いあり mysql> select concat('"',varchar_string,'"'), concat('"',char_string,'"'), concat( '"',text_string,'"') from vchatest; +--------------------------------+-----------------------------+------------------------------+ | concat('"',varchar_string,'"') | concat('"',char_string,'"') | concat( '"',text_string,'"') | +--------------------------------+-----------------------------+------------------------------+ | "STR " | "STR" | "STR " | +--------------------------------+-----------------------------+------------------------------+ 1 row in set (0.01 sec)
【関連記事】
▶MySQLのVARCHAR型 charとは末尾の空白の扱いが違う
また、MySQLの場合、データ型宣言のvarchar(x)のxの数値は文字数です。
// あいうえおあいうえお=10文字20バイトをvarchar(8)にinsertしようとするとエラー mysql> INSERT INTO `employees`.`vchatest` (`varchar_string`, `char_string`, `text_string`) VALUES ('あいうえおあいうえお', 'x', 'x'); ERROR 1406 (22001): Data too long for column 'varchar_string' at row 1 // あいうえおあいう=8文字16バイトをvarchar(8)にinsertすると成功 mysql> INSERT INTO `employees`.`vchatest` (`varchar_string`, `char_string`, `text_string`) VALUES ('あいうえおあいう', 'x', 'x'); Query OK, 1 row affected (0.04 sec) // varchar(8)に「あいうえおあいう」が格納されている。 mysql> select * from vchatest; +-----------------+-------------+-------------+ | varchar_string | char_string | text_string | +-----------------+-------------+-------------+ | あいうえおあいう | x | x | +-----------------+-------------+-------------+
上記の例では、varchar(8)には全角10文字は格納できずエラーとなりますが、全角8文字はエラーなく格納できています。このことから、MySQLのvarcharの数値は文字数であることを確認しているんですね。
SQL Serverでは、varcharはバイト数、nvarcharは文字数を指定するものとしてデータ型自体が分けられています。また、Oracleでは、varchar2はバイト数指定になります。varchar2(10)なら、10バイトの文字列が格納できるんですね。
このように、varcharの仕様はデータベース管理ソフトごとにことなっているようです。
まとめ
- varcharは、文字列を格納するデータ型
- varchar型、char型、text型で挙動が異なる
- varcharのサイズ指定はデータベース管理ソフトごとに文字数の場合とバイト数の場合あり