Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

PHP, ORM, MSSQL dan Unicode, apakah mungkin untuk membuat ini bekerja bersama?

Pembaruan: Pengemudi tidak lagi dalam pratinjau. MS telah memberikan instruksi resmi untuk versi yang sekarang dirilis:https://www.microsoft.com/en-us/sql-server/developer-get-started/php-ubuntu

Petunjuk di bawah sekarang sudah kedaluwarsa karena MS telah menarik unduhan driver pratinjau.

Nah, ada driver ODBC yang disediakan oleh Microsoft. Itu harus memberikan perilaku yang tepat dalam hal ini. Lihat akhir pos untuk mengetahui cara saya menguji perilakunya (dalam cara awal). Itu diuji terhadap Azure SQL Database V12.

Cara menginstal driver Microsoft SQL ODBC di Ubuntu 16.04

Ini diuji pada instance Ubuntu 16.04 Azure baru yang didasarkan pada image Ubuntu 16.04 Azure yang disediakan oleh Canonical. Setelah masuk, saya beralih ke pengguna root menggunakan sudo -i , maka:

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

Uji

Ganti server dan kredensial dalam perintah berikut dengan milik Anda.

sqlcmd -S somedatabase.database.windows.net -U someuser -P somepassword

Anda harus dapat mengeluarkan perintah SQL pada saat ini. Oke, mari kita bekerja dengan php.

Gunakan dengan php

Kita harus memastikan paket libodbc1 tidak terinstal dan tidak akan terinstal, seperti yang akan digunakan oleh php alih-alih paket yang dipatuhi khusus, dan itu akan menyebabkan masalah penyandian.

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

Pada titik ini, Anda harus menyediakannya sebagai Driver ODBC.

Menguji perilakunya

Buat file php, test.php dengan encoding UTF-8, dan dengan konten berikut. Ganti server, database, dan kredensial dalam string koneksi dengan milik Anda.

<?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

Menjalankan ini dengan php -f test.php menunjukkan bahwa kita mendapatkan kembali string tanpa korupsi. Juga, string terlihat bagus dari SQL Server Management Studio juga. Saya mengamati kueri berikut pada halaman Performance Insight dari Azure Portal:(@P1 nvarchar(max))INSERT INTO test VALUES(@P1) , jadi pernyataan yang disiapkan jelas digunakan, jadi saya berasumsi bahwa itu bisa menangani skenario Anda (dan saya).

(Posting ini sangat membantu ketika mencoba membuatnya berfungsi:http://www.codesynthesis.com/~boris/blog/2011/12/02/microsoft-sql-server-odbc-driver-linux/ Terima kasih boris !)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Mengaktifkan Semua Batasan PERIKSA &Kunci Asing untuk Tabel di SQL Server (Contoh T-SQL)

  2. 2 Cara Membuat Database di Linked Server menggunakan T-SQL

  3. Apa tipe data yang paling tepat untuk menyimpan alamat IP di SQL server?

  4. Bagaimana menjalankan kueri yang sama pada semua database pada sebuah instance?

  5. Batasan SQL DEFAULT untuk Menyisipkan Kolom dengan Nilai Default ke Tabel SQL Server