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のサイズ指定はデータベース管理ソフトごとに文字数の場合とバイト数の場合あり