概要
キャッシュデータベースとしてMicrosoft SQL Serverを使用する場合、他のデータベースとのVARCHAR型の性質の違いに注意する必要があります。
MySQL, PostgreSQLなどのデータベースで日本語文字列を保持する場合にvarchar型を使用し、長さは 文字数 で定義します。
一方、SQL Serverのvarchar型は、長さは バイト単位 で定義されます。
例えば、同じvarchar(10)と定義されたフィールドでも、日本語文字などマルチバイトエンコードされる文字が含まれると、SQL Serverでは10文字保持できない場合があります。
MySQL, PostgreSQLのテーブルをキャッシュ化し、SQL Serverにキャッシュテーブルを作成するケースを考えます。
TDVでキャッシュテーブルを自動作成すると、ソーステーブルの varchar(n) の項目は、キャッシュテーブルでもそのままの型と長さで varchar(n) として作成されるため、SQL Server側で長さ不足になり、キャッシュ処理に失敗することがあります。
回避策はいくつか考えられますが、この記事では、キャッシュテーブルで varchar に代えて nvarchar を使用する方法について説明します。
なお、nvarcharを使用した場合でも、nvarchar(n)のnは文字数を指定するものではないため、この事象を完全に回避できないことがあります。詳細な仕様につきましては、Microsoft社の情報をご確認ください。
nchar および nvarchar (Transact-SQL)
また、この回避策の使用に際しましては、システム要件を元に十分なテストと検証を実施いただくようご留意ください。
設定手順
キャッシュテーブルの該当するカラムを nvarchar へ変更するには、以下の設定を行います。
- TDV StudioでキャッシュテーブルのDDLを生成する
- 日本語文字を保存するカラムを varchar から nvarchar へ変更する
- 修正したDDLを、SQL Serverで実行する
- TDV Studioでイントロスペクトを実行し、キャッシュテーブルとして指定する
TDVが生成するキャッシュテーブルのDDLをもとに、データ型を変更し、マニュアルでテーブルを作成します。
設定例
設定例として、MySQLの以下 customer テーブルへキャッシュをマニュアル設定する手順を示します。
カラム firstname, lastname が日本語を前提としたカラムです。
使用環境
製品 | バージョン | 実行環境 |
---|---|---|
TDV | 8.8.0 | Windows 10 |
MySQL | 5.7 | |
SQL Server | 2019 Express |
1. TDV StudioでキャッシュテーブルのDDLを生成する
まずひな形とするキャッシュテーブルのDDLを生成します。
MySQLのデータソースを開き、キャッシュの設定をしていきます。
通常のキャッシュテーブルの要領で設定し、「キャッシュテーブルの作成」ボタンをクリックします。
ダイアログに生成されたDDLが表示されます。
このDDLをコピーし、テキストエディタにペーストしてください。
このダイアログは キャンセル して閉じます。
2. 日本語文字を保存するカラムを varchar から nvarchar へ変更する
この例は複数テーブルを使用する設定で、DDLには customer_0~2 が定義されています。
各テーブルの日本語を保存するカラムを nvarchar へ変更します。
3. 修正したDDLを、SQL Serverで実行する
修正したDDLを sqlcmd などで実行し、キャッシュテーブルをマニュアル作成します。
C:\Users>sqlcmd -U tdv -d tdv
パスワード:
1> -- Composite Studioが生成したDDL (2025年5月8日 木 JST 14:01:42)
2> -- キャッシュリソース '/shared/Sample/MySQL/customer'
3> -- データソース '/shared/Sample/SQLServer2019'
4> -- テーブル '/shared/Sample/SQLServer2019/tdv/dbo/customer_0'
5>
6> DROP TABLE IF EXISTS [tdv].[dbo].[customer_0];
7>
8> CREATE TABLE [tdv].[dbo].[customer_0] (
9> [customerid] int,
10> [firstname] nvarchar(255),
11> [lastname] nvarchar(255),
12> [phonenumber] varchar(100)
13> );
14>
15> CREATE UNIQUE INDEX [customer_0_PRIMARY] ON [tdv].[dbo].[customer_0]([customerid] asc);
16>
・・・【省略】・・・
41>
42> CREATE TABLE [tdv].[dbo].[customer_2] (
43> [customerid] int,
44> [firstname] nvarchar(255),
45> [lastname] nvarchar(255),
46> [phonenumber] varchar(100)
47> );
48>
49> CREATE UNIQUE INDEX [customer_2_PRIMARY] ON [tdv].[dbo].[customer_2]([customerid] asc);
50>
51>
52> go
1>
4. TDV Studioでイントロスペクトを実行し、キャッシュテーブルとして指定する
次に、キャッシュターゲットとなる SQLServer のデータソースを開きます。
「リソースの追加/削除」ボタンからイントロスペクトを行い、前ステップで作成したキャッシュテーブル customer_0~2 を追加します。
最後に、MySQL のデータソースを開き、キャッシュテーブルとして customer_0~2 を指定します。
「キャッシュのテーブルを選択」を選び、
選択ダイアログで、customer_0 を選択します。
同じ要領で、customer_1、customer_2 も追加します。
設定の保存後、キャッシュが動作すれば完了です。
参照情報
この記事は、Cloud Software Group社の以下の技術記事を元に作成しました。