Help us understand the problem. What is going on with this article?

Ubuntu PHPから表示されないSQL Serverのフィールド

More than 1 year has passed since last update.

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の付く型では絵文字が問題なく表示できるが、それ以外だと?に変換されてしまうようだ。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away