sql >> データベース >  >> RDS >> Sqlserver

PHP、ORM、MSSQL、Unicode、これらを一緒に機能させることは可能ですか?

    更新: ドライバーはプレビューされなくなりました。 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 !)




    1. テーブル値パラメータをJavaからSQLServerストアドプロシージャに渡す方法は?

    2. 長所と短所を使用してSQLServerテーブルの行をカウントする4つの方法

    3. PostgreSQLのSlonyレプリケーションに関するエキスパートガイド

    4. サーバーやphpMyADMINにアクセスせずにSQLテーブルをエクスポートする簡単な方法