目次 前項目  次項目

3.2 キャラクタセット指定の注意事項

日本語の文字列を格納しているデータベースを使う場合には、使用している キャラクタセットと、フィールドに定義しているキャラクタセットが等しく、 コード変換が必要無い場合でも、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> 

目次 前項目  次項目

InterBase for Linux & FreeBSD Copyright(c) 1998 RIOS Corporation