sql >> Database >  >> RDS >> Sqlserver

PHP, ORM, MSSQL en Unicode, is het mogelijk om deze samen te laten werken?

Bijwerken: De driver is niet langer in preview. MS heeft officiële instructies gegeven voor de nu vrijgegeven versie:https://www.microsoft.com/en-us/sql-server/developer-get-started/php-ubuntu

De onderstaande instructies zijn nu verouderd omdat MS de download van het voorbeeldstuurprogramma heeft opgehaald.

Welnu, er is het ODBC-stuurprogramma dat door Microsoft wordt geleverd. Dat moet in dit opzicht goed gedrag opleveren. Zie het einde van de post voor hoe ik het gedrag heb getest (op een voorlopige manier). Het is getest tegen een Azure SQL Database V12.

Hoe installeer ik het Microsoft SQL ODBC-stuurprogramma op Ubuntu 16.04

Dit is getest op de nieuwe Ubuntu 16.04 Azure-instantie die was gebaseerd op de Ubuntu 16.04 Azure-image geleverd door Canonical. Nadat ik me had aangemeld, schakelde ik over naar de root-gebruiker met behulp van sudo -i , dan:

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

Test het

Vervang de server en de inloggegevens in de volgende opdracht door die van uzelf.

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

U zou op dit punt SQL-opdrachten moeten kunnen geven. Oké, laten we het werken met php.

Gebruik het met php

We moeten ervoor zorgen dat het libodbc1-pakket niet is geïnstalleerd en dat het niet wordt geïnstalleerd, omdat dat door php zou worden gebruikt in plaats van door ons aangepaste pakket, en dat zou leiden tot coderingsproblemen.

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

Op dit moment zou u het beschikbaar moeten hebben als een ODBC-stuurprogramma.

Het gedrag testen

Maak een php-bestand, test.php met UTF-8-codering en met de volgende inhoud. Vervang de server, de database en de inloggegevens in de verbindingsreeks door die van uzelf.

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

Dit uitvoeren met php -f test.php laat zien dat we de string terugkrijgen zonder enige corruptie. De string ziet er ook goed uit vanuit SQL Server Management Studio. Ik zag de volgende vraag op de Performance Insight-pagina van de Azure Portal:(@P1 nvarchar(max))INSERT INTO test VALUES(@P1) , dus er werden duidelijk voorbereide verklaringen gebruikt, dus ik neem aan dat het jouw (en mijn) scenario aankan.

(Dit bericht was een grote hulp bij het proberen om dit te laten werken:http://www.codesynthesis.com/~boris/blog/2011/12/02/microsoft-sql-server-odbc-driver-linux/ Bedankt boris !)




  1. Hoe het aantal rijen in sqlite te krijgen met Android?

  2. Een overzicht van SQL Join-types met voorbeelden

  3. Hoe Arabische karakters in de SQL-database in te voegen?

  4. Controleer de status van alle database-e-mailberichten in SQL Server (T-SQL)