2014-06-15 2 views
5

आप यूनिकोड डेटा बचत कर रहे हैं, तो आप एक स्तंभ प्रकार nvarchar (एट। अल) में बचाने की जरूरत है MSSQL करने के लिए और क्या आप तैयार बयान का उपयोग कर रहे हैं, तो राजधानी एन साथ एसक्यूएल STRING शाब्दिक उपसर्ग चाहिए, तो आप उपसर्ग मूल्यों की जरूरत नहीं है एन के साथPHP, ओआरएम, एमएसएसक्यूएल और यूनिकोड, क्या यह काम एक साथ करना संभव है?

tbl में डालने (col) मूल्यों (N'hello ')

आप जेडएफ डीबी की तरह एक ORM का उपयोग कर रहे हैं, तो आप पीडीओ का उपयोग कर रहे MSSQL को conect करने के लिए (या आप विंडोज पर तैनाती कर रहे हैं , इस मामले में आप SQLSRV या PDO_SQLSRV का उपयोग कर रहे हैं और सबकुछ काम करेगा और मेरा प्रश्न अब और समझ में नहीं आता है)।

यदि आप किसी भी पीडीओ संस्करण का उपयोग कर रहे हैं जो लिनक्स पर mssql (sybase, dblib, आदि) से कनेक्ट होता है तो आपको वास्तविक तैयार कथन नहीं मिलते हैं, केवल नकल किया जाता है।

आप तैयार बयान नकल करते है, तो तार के स्तर पर,, एसक्यूएल पूरी तरह से बाहर केवल स्ट्रिंग शाब्दिक के साथ लिखा जाता है और इसका मतलब है कि आप

  1. यह बिल्कुल है एन के साथ किसी भी संभावित यूनिकोड मान उपसर्ग चाहिए ZF के साथ एन के साथ स्वचालित रूप से किसी भी चार मान को प्रीपेड करना संभव है?
  2. क्या कोई ओआरएम/टेबल गेटवे libs है जो इस तरह के मूल्य कुशलता की अनुमति देता है?
  3. क्या लिनक्स से सर्वर पक्ष तैयार कथन सक्षम करने का कोई तरीका है?
  4. क्या कोई वास्तव में लिनक्स कोड से उत्पादन PHP चलाता है और इसे एमएसएसक्यूएल के खिलाफ चलाता है? (यदि हाँ, आप कैसे यूनिकोड के साथ सौदा करते हैं?)

संपादित करें: मैं लिनक्स से MSSQL को बचाने के लिए यूनिकोड प्राप्त कर सकते हैं, लेकिन 7/8 के लिए FreeTDS प्रोटोकॉल उन्नयन सभी व्यवस्थाएं/पुस्तकालयों/ORMS को तोड़ने के लिए है क्योंकि लगता है एन उपसर्ग के साथ सामान्य एसक्यूएल क्या होगा बदलने के लिए पूर्ण आवश्यकता का। मुझे यकीन नहीं है कि इंटरनेट पर कोई भी जो दावा करता है कि प्रोटोकॉल संस्करण 7/8 में अपग्रेड करने से उनका यूनिकोड समस्याएं वास्तव में हाथों के अलावा कुछ भी करती हैं, प्रत्येक गैर-पोर्टेबल तरीके से प्रत्येक SQL कथन लिखते हैं। ऐसा लगता है कि फ्रीट्स 4.2 पर रहना यूनिकोड/यूटीएफ -8 और एमएसएसक्ल से निपटने का सबसे अच्छा तरीका है।

उत्तर

6

अद्यतन: ड्राइवर अब पूर्वावलोकन में नहीं है। एमएस ने अब जारी संस्करण के लिए आधिकारिक निर्देश दिए हैं: https://www.microsoft.com/en-us/sql-server/developer-get-started/php-ubuntu

नीचे दिए गए निर्देश अब से बाहर हैं क्योंकि एमएस ने पूर्वावलोकन ड्राइवर डाउनलोड खींच लिया है।


ठीक है, माइक्रोसॉफ्ट द्वारा प्रदान किया गया ओडीबीसी ड्राइवर है। इस संबंध में उचित व्यवहार प्रदान करना चाहिए। इस पोस्ट के अंत को देखें कि मैंने अपने व्यवहार का परीक्षण कैसे किया (प्रारंभिक तरीके से)। यह एक Azure SQL डेटाबेस V12 के खिलाफ परीक्षण किया गया था।

उबंटू 16.04

यह ताजा उबंटू 16.04 Azure उदाहरण है कि उबंटू 16.04 Azure विहित द्वारा प्रदान की छवि पर आधारित था पर परीक्षण किया गया था पर Microsoft SQL ODBC ड्राइवर स्थापित करने के लिए।में प्रवेश करने के बाद, मैं sudo -i का उपयोग कर जड़ उपयोगकर्ता के लिए बंद है, तो:

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 

इस बिंदु पर, आपको इसे ओडीबीसी चालक के रूप में उपलब्ध होना चाहिए।

परीक्षण अपने व्यवहार

एक php फ़ाइल, UTF-8 एन्कोडिंग के साथ test.php बनाएँ, और निम्नलिखित सामग्री के साथ। अपने आप के साथ कनेक्शन स्ट्रिंग में सर्वर, डेटाबेस और क्रेडेंशियल्स को बदलें।

<?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 सर्वर प्रबंधन स्टूडियो से भी अच्छी लगती है। मैंने Azure पोर्टल के प्रदर्शन अंतर्दृष्टि पृष्ठ पर निम्नलिखित क्वेरी देखी: (@P1 nvarchar(max))INSERT INTO test VALUES(@P1), इसलिए तैयार कथन स्पष्ट रूप से उपयोग किए गए थे, इसलिए मुझे लगता है कि यह आपके (और मेरे) परिदृश्य को संभाल सकता है।

(इस पोस्ट में बहुत मदद की थी इस काम करने के लिए प्राप्त करने की कोशिश करते हुए: http://www.codesynthesis.com/~boris/blog/2011/12/02/microsoft-sql-server-odbc-driver-linux/ धन्यवाद बोरिस)

+0

क्षमा, पीडीओ :: lastInsertId काम नहीं करता है, तो यह शायद है नो-जाना सबसे ORMs के साथ। –

+0

मैं एक ओआरएम को संशोधित करने में कामयाब रहा ताकि वह पीडीओ :: lastInsertId में उपयोग करने का प्रयास न करे, लेकिन आईडी को वापस पाने के लिए सम्मिलित बयानों में OUTPUT खंड का उपयोग करता है। यह एक आश्चर्यजनक रूप से सरल परिवर्तन था। सब कुछ अब के लिए अच्छा लग रहा है। –

+0

हैलो @ टार्ने, यह सुनना अच्छा है! आपने क्या ओआरएम संशोधित किया? मैं माइक्रोसॉफ्ट के ड्राइवरों पर काम करता हूं और आपकी समस्या के बारे में अधिक जानना चाहता हूं और आप इसे ठीक करने के लिए कैसे मिलते हैं। –

संबंधित मुद्दे