日本語の文字列を格納しているデータベースを使う場合には、使用している
キャラクタセットと、フィールドに定義しているキャラクタセットが等しく、
コード変換が必要無い場合でも、SET NAMES文により使用するキャラクタセットを
指定してください。
例えば、isql を起動して以下のようなデータベースを作成してみてください。
% isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> SET NAMES EUCJ_0208 ;
SQL> CREATE DATABASE "sample.gdb" ;
SQL> CREATE TABLE departments ( dep_code INTEGER,
dep_name VARCHAR(20) CHARACTER SET EUCJ_0208 ) ;
SQL> INSERT INTO departments VALUES ( 1, "第1営業部" ) ;
SQL> INSERT INTO departments VALUES ( 2, "第2営業部" ) ;
SQL> INSERT INTO departments VALUES ( 3, "第1製造部" ) ;
SQL> INSERT INTO departments VALUES ( 4, "第2製造部" ) ;
SQL> COMMIT ;
SQL> QUIT ;
このデータベースの部署テーブル(departments)の部署名(dep_name)の
フィールドには、キャラクタセットとしてEUCを指定しています。Linux上の
アプリケーションで、このフィールドの文字列を無条件で取り出す時には、
コード変換の必要が無いため、SET NAMES文を使用しなくても問題はありません。
しかし、SET NAMES文を使用せずデータベースに接続し、部署テーブルの
部署名が”製造”を含むレコードを取り出すための以下のSQL文を入力して
みてください。
% isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> CONNECT "sample.gdb" ;
Database: "sample.gdb"
SQL> SELECT * FROM departments
WHERE dep_name LIKE "%製造%" ;
DEP_CODE DEP_NAME
=========== ========================================
Statement failed, SQLCODE = -802
arithmetic exception, numeric overflow, or string truncation
-Cannot transliterate character between character sets
SQL>
文字コードの変換などができなかったことを示すエラーメッセージが
出力されます。
また、部署テーブルにレコードを挿入するための以下のSQL文を入力して
みてください。同じように、エラーメッセージが出力されます。
SQL> INSERT INTO departments VALUES ( 5, "総務部" ) ;
Statement failed, SQLCODE = -802
arithmetic exception, numeric overflow, or string truncation
-Cannot transliterate character between character sets
SQL>
これら2つの例では、入力したSQL文の中にEUCの日本語が含まれています。
これらの日本語は、EUCとして定義されている文字列フィールドに作用するもの
なので、コード変換の必要はありません。しかし、InterBaseにとっては、入力
された日本語は未知のコードであり、比較や格納の時にコード変換の必要が無い
ということが分からないため変換エラーとなります。
isqlを再起動して、SET NAMES文でEUCを指定して、同じことを行ってみて
ください。エラーメッセージは表示されず、正常終了します。
% isql
Use CONNECT or CREATE DATABASE to specify a database
SQL> SET NAMES EUCJ_0208 ;
SQL> CONNECT "sample.gdb" ;
Database: "sample.gdb"
SQL> SELECT * FROM departments
WHERE dep_name LIKE "%製造%" ;
DEP_CODE DEP_NAME
=========== ========================================
3 第1製造部
4 第2製造部
SQL>