Microsoft公式のSQL Serverへ接続するPHPのドライバーを試しています。
Ubuntuからでもapt-get一発でインストールできるようになりました。
設定等はMicrosoft公式ドライバーでUbuntuからSQLServerを見に行くを参照。
日本語で入力しているテキストが特定のField型だと表示しないことが分かりました。
なんとchar型のフィールドのデータだけ表示しないようです。
テキストを入れるデータ型でほかにも表示されないデータ型があるのでは?
と思い、調査してみました。
結果
Field型 | ASCII文字表示 | 日本語表示 | 絵文字表示 |
---|---|---|---|
char | ○ | × | × |
varchar | ○ | ○ | × |
text | ○ | ○ | × |
nchar | ○ | ○ | ○ |
ntext | ○ | ○ | ○ |
nvarchar | ○ | ○ | ○ |
調査方法
以下のように各種データ型のフィールドを持ったTableを作成していく。
PHP側から表示ができるか確認する。
テーブル作成
use 日本語システム
Create table タイトル(
ID int identity(1,1) not null primary key
,char char(20)
,varchar varchar(20)
,nchar nchar(20)
,nvarchar nvarchar(20)
,text text
,ntext ntext
);
insert into タイトル(
char,
varchar,
nchar,
nvarchar,
text,
ntext
)
values
(
'ASCII Char',
'ASCII Char',
'ASCII Char',
'ASCII Char',
'ASCII Char',
'ASCII Char'
)
,(
'㈱とか',
'㈱とか',
'㈱とか',
'㈱とか',
'㈱とか',
'㈱とか'
)
,(
N'Microsoft❤Linux',
N'Microsoft❤Linux',
N'Microsoft❤Linux',
N'Microsoft❤Linux',
N'Microsoft❤Linux',
N'Microsoft❤Linux'
);
実行するPHP
<?php
$serverName = "IPAddr";
$connectionOptions = array(
"Database" => "日本語システム",
"Uid" => "sa",
"PWD" => "Password"
);
//Establishes the connection
$conn = sqlsrv_connect($serverName, $connectionOptions);
if($conn)
echo "Connected!";
$tsql="SELECT * FROM タイトル";
$getProducts = sqlsrv_query($conn, $tsql);
if ($getProducts == FALSE)
die(FormatErrors(sqlsrv_errors()));
$productCount = 0;
while($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC))
{
print_r($row);
$productCount++;
}
sqlsrv_free_stmt($getProducts);
sqlsrv_close($conn);
function FormatErrors( $errors )
{
echo "Error information: ";
foreach ( $errors as $error )
{
echo "SQLSTATE: ".$error['SQLSTATE']."";
echo "Code: ".$error['code']."";
echo "Message: ".$error['message']."";
}
}
?>
実行結果1
$ php show.php
Connected!Array
(
[ID] => 1
[char] => ASCII Char
[varchar] => ASCII Char
[nchar] => ASCII Char
[nvarchar] => ASCII Char
[text] => ASCII Char
[ntext] => ASCII Char
)
あれ?
1行しか表示していない。
char型のフィールドに格納されている文字をnullにしてしまおう。
char型の2行目のデータをnullに
$ sqlcmd -S IPAddr -U sa -P password
1> USE 日本語システム
2> go
データベース コンテキストが '日本語システム' に変更されました。
1> UPDATE タイトル SET char = null WHERE ID=2
2> go
(1 rows affected)
1> quit
実行結果2
$ php test.php
Connected!Array
(
[ID] => 1
[char] => ASCII Char
[varchar] => ASCII Char
[nchar] => ASCII Char
[nvarchar] => ASCII Char
[text] => ASCII Char
[ntext] => ASCII Char
)
Array
(
[ID] => 2
[char] =>
[varchar] => ㈱とか
[nchar] => ㈱とか
[nvarchar] => ㈱とか
[text] => ㈱とか
[ntext] => ㈱とか
)
Array
(
[ID] => 3
[char] => Microsoft?Linux
[varchar] => Microsoft?Linux
[nchar] => Microsoft❤Linux
[nvarchar] => Microsoft❤Linux
[text] => Microsoft?Linux
[ntext] => Microsoft❤Linux
)
char型に日本語文字列を入れるとその文字以降表示しないということが分かった。
nの付く型では絵文字が問題なく表示できるが、それ以外だと?に変換されてしまうようだ。