更新: ドライバーはプレビューされなくなりました。 MSは、現在リリースされているバージョンの公式な手順を提供しています:https://www.microsoft.com/en-us/sql-server/developer-get-started/php-ubuntu
以下の手順は現在古くなっています MSがプレビュードライバのダウンロードをプルしたため。
さて、Microsoftが提供するODBCドライバーがあります。これにより、この点で適切な動作が提供されます。 (予備的な方法で)その動作をテストした方法については、投稿の最後を参照してください。 Azure SQLDatabaseV12に対してテストされました。
Ubuntu16.04にMicrosoftSQLODBCドライバーをインストールする方法
これは、Canonicalによって提供されたUbuntu16.04Azureイメージに基づいた新しいUbuntu16.04Azureインスタンスでテストされました。ログイン後、sudo -i
を使用してrootユーザーに切り替えました 、次に:
apt-get update
apt-get -y install atool make build-essential libc6 libkrb5-3 libgss3 e2fsprogs openssl equivs
wget https://download.microsoft.com/download/2/E/5/2E58F097-805C-4AB8-9FC6-71288AB4409D/msodbcsql-13.0.0.0.tar.gz
atool -x msodbcsql-13.0.0.0.tar.gz
rm msodbcsql-13.0.0.0.tar.gz
pushd msodbcsql-13.0.0.0/
./build_dm.sh --accept-warning | tee build_dm_result.txt
command=$(cat build_dm_result.txt | grep "Run the command" | cut -d"'" -f2)
rm build_dm_result.txt
sh -c "$command"
popd
echo "/usr/lib64" > /etc/ld.so.conf.d/microsoft-lib64.conf
ldconfig
pushd msodbcsql-13.0.0.0/
./install.sh install --accept-license
テスト
次のコマンドのサーバーとクレデンシャルを独自のものに置き換えます。
sqlcmd -S somedatabase.database.windows.net -U someuser -P somepassword
この時点でSQLコマンドを発行できるはずです。さて、phpで動作させましょう。
phpで使用
libodbc1パッケージがインストールされていないこと、およびインストールされないことを確認する必要があります。これは、カスタム準拠のパッケージではなくphpで使用されるため、エンコードの問題が発生する可能性があります。
cat > libodbc1<<EOL
Section: misc
Priority: optional
Standards-Version: 3.9.2
Package: libodbc1
Version: 9999
Description: fake pkg, so that we satisfy the dependency of php7-odbc, so that we can keep our custom built libodbc
EOL
equivs-build libodbc1
dpkg -i libodbc1_9999_all.deb
rm libodbc1
rm libodbc1_9999_all.deb
apt-get install php7.0-odbc php7.0-cli
この時点で、ODBCドライバーとして使用できるようになっているはずです。
動作のテスト
次の内容のphpファイルtest.phpをUTF-8エンコーディングで作成します。サーバー、データベース、および接続文字列のクレデンシャルを独自のものに置き換えます。
<?php
$pdo = new PDO('odbc:Driver={ODBC Driver 13 for SQL Server};Server=tcp:somedatabase.database.windows.net,1433;Database=somedatabase;[email protected];Pwd=somepassword;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;');
$str = 'Árvíztűrő tükörfúrógép, and... 你好,世界';
$pdo->prepare("DROP TABLE test")->execute();
$pdo->prepare("CREATE TABLE test(a NVARCHAR(MAX))")->execute();
$stmt = $pdo->prepare("INSERT INTO test VALUES(?)");
$stmt->bindParam(1, $str);
$stmt->execute();
$stmt = $pdo->prepare("SELECT * FROM test");
$stmt->execute();
$data = $stmt->fetchall();
var_dump($data[0][0]==$str); //Returns true
$stmt = $pdo->prepare("SELECT * FROM test WHERE a=?");
$stmt->bindParam(1, $str);
$stmt->execute();
$data = $stmt->fetchall();
var_dump($data[0][0]==$str); //Returns true
php -f test.php
でこれを実行する は、破損することなく文字列を取得することを示しています。また、この文字列はSQL ServerManagementStudioからも見栄えがします。 AzureポータルのPerformanceInsightページで次のクエリを確認しました:(@P1 nvarchar(max))INSERT INTO test VALUES(@P1)
、そのように準備されたステートメントが明らかに使用されたので、私はそれがあなたの(そして私の)シナリオを処理できると思います。
(この投稿は、これを機能させるために非常に役立ちました:http://www.codesynthesis.com/~boris/blog/2011/12/02/microsoft-sql-server-odbc-driver-linux/ありがとうboris !)