Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

PHP, ORM, MSSQL i Unicode, czy można je połączyć?

Aktualizacja: Sterownik nie jest już w podglądzie. MS dostarczył oficjalne instrukcje dla obecnie wydanej wersji:https://www.microsoft.com/en-us/sql-server/developer-get-started/php-ubuntu

Poniższe instrukcje są teraz nieaktualne ponieważ MS pobrał podgląd sterownika do pobrania.

Cóż, jest sterownik ODBC dostarczony przez Microsoft. To powinno zapewnić właściwe zachowanie w tym zakresie. Zobacz na końcu posta, jak przetestowałem jego zachowanie (wstępnie). Został przetestowany pod kątem Azure SQL Database V12.

Jak zainstalować sterownik Microsoft SQL ODBC w Ubuntu 16.04

Zostało to przetestowane na nowym wystąpieniu Ubuntu 16.04 Azure, które było oparte na obrazie Ubuntu 16.04 Azure dostarczonym przez firmę Canonical. Po zalogowaniu przełączyłem się na użytkownika root za pomocą sudo -i , a następnie:

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

Przetestuj

Zastąp serwer i poświadczenia w poniższym poleceniu własnymi.

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

W tym momencie powinieneś być w stanie wydawać polecenia SQL. OK, niech działa z php.

Użyj go z php

Musimy upewnić się, że pakiet libodbc1 nie jest zainstalowany i że nie zostanie zainstalowany, ponieważ byłby on używany przez php zamiast naszego niestandardowego, a to prowadziłoby do problemów z kodowaniem.

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

W tym momencie powinieneś mieć go dostępny jako sterownik ODBC.

Testowanie jego zachowania

Utwórz plik php test.php z kodowaniem UTF-8 i następującą zawartością. Zastąp serwer, bazę danych i poświadczenia w ciągu połączenia własnymi.

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

Uruchamianie tego z php -f test.php pokazuje, że otrzymujemy łańcuch bez żadnych uszkodzeń. Również ciąg wygląda dobrze z SQL Server Management Studio. Zaobserwowałem następujące zapytanie na stronie Performance Insight w Azure Portal:(@P1 nvarchar(max))INSERT INTO test VALUES(@P1) , więc oczywiście wykorzystano przygotowane zestawienia, więc zakładam, że poradzi sobie z twoim (i moim) scenariuszem.

(Ten post był bardzo pomocny podczas próby uruchomienia tego działania:http://www.codesynthesis.com/~boris/blog/2011/12/02/microsoft-sql-server-odbc-driver-linux/ Dzięki 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. Najwydajniejszy sposób T-SQL na wypełnienie zmiennej po lewej stronie do określonej długości?

  2. Dodawanie wskazówki do zapytania podczas wywoływania funkcji z wartościami tabelowymi

  3. Node.js i Microsoft SQL Server

  4. Planowe utrzymanie bazy danych IS 24/7 w MS SQL Server

  5. Połącz się z bazą danych MSSQL za pomocą Flask-SQLAlchemy