LoginSignup
1
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-04-27

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1