sql >> Databasteknik >  >> RDS >> Sqlserver

PHP, ORM, MSSQL och Unicode, är det möjligt att få dessa att fungera tillsammans?

Uppdatering: Drivrutinen är inte längre i förhandsvisning. MS har tillhandahållit officiella instruktioner för den nu släppta versionen:https://www.microsoft.com/en-us/sql-server/developer-get-started/php-ubuntu

Instruktionerna nedan är nu inaktuella eftersom MS har hämtat förhandsgranskningsdrivrutinen.

Tja, det finns ODBC-drivrutinen från Microsoft. Det borde ge rätt beteende i detta avseende. Se slutet av inlägget för hur jag testade dess beteende (på ett preliminärt sätt). Den testades mot en Azure SQL Database V12.

Hur man installerar Microsoft SQL ODBC-drivrutinen på Ubuntu 16.04

Detta testades på den färska Ubuntu 16.04 Azure-instansen som var baserad på Ubuntu 16.04 Azure-bilden från Canonical. Efter att ha loggat in bytte jag till root-användaren med sudo -i , sedan:

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

Testa det

Ersätt servern och autentiseringsuppgifterna i följande kommando med ditt eget.

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

Du bör kunna utfärda SQL-kommandon vid denna tidpunkt. Okej, låt oss få det att fungera med php.

Använd den med php

Vi måste se till att libodbc1-paketet inte är installerat och att det inte kommer att installeras, eftersom det skulle användas av php istället för vår anpassade efterlevnad, och det skulle leda till kodningsproblem.

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

Vid det här laget bör du ha den tillgänglig som en ODBC-drivrutin.

Testa dess beteende

Skapa en php-fil, test.php med UTF-8-kodning och med följande innehåll. Ersätt servern, databasen och referenserna i anslutningssträngen med din egen.

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

Kör detta med php -f test.php visar att vi får tillbaka strängen utan någon korruption. Strängen ser också bra ut från SQL Server Management Studio. Jag såg följande fråga på sidan Performance Insight i Azure Portal:(@P1 nvarchar(max))INSERT INTO test VALUES(@P1) , så förberedda uttalanden användes uppenbarligen, så jag antar att det skulle kunna hantera ditt (och mitt) scenario.

(Det här inlägget var till stor hjälp när jag försökte få det här att fungera:http://www.codesynthesis.com/~boris/blog/2011/12/02/microsoft-sql-server-odbc-driver-linux/ Tack boris !)




  1. Knee-Jerk Wait Statistik:PAGEIOLATCH_SH

  2. Hur man beviljar alla privilegier på vyer till godtyckliga användare

  3. 3 sätt att få den första dagen i månaden i SQL Server

  4. ASIN() Funktion i Oracle