unicode string corruption when using PDO_ODBC with FreeTDS 1.3.6 and MS SQL Server 2016
Offen
Dieses Issue hat noch niemand übernommen.
Bug
Extension: pdo_odbc
Status: Needs Triage
- Vorherrschende Sprache
- C
- Sterne
- 40.4k
- Forks
- 8.2k
- Ø Merge
- 2 T. 13 Std.
- Gemergte PRs (30 T.)
- 96
Beschreibung
Description
The following code:
<?php
// setup database connection
$u = getenv('DB_USERNAME');
$p = getenv('DB_PASSWORD');
$dsn = 'odbc:testUTF8';
$db = new \PDO($dsn, $u, $p);
$db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$constant_tests = [
"SELECT CAST(0x72006f017e016f007600fd00 AS nvarchar(10)) AS pink_in_czech_binary_encoded_utf16;",
"SELECT CAST(0x6b26 AS nvarchar(3)) AS Beamed_Eighth_Notes_binary_encoded_utf16;",
"SELECT NCHAR(0x266b) AS Beamed_Eighth_Notes_nchar;",
"SELECT N'♫' AS Beamed_Eighth_Notes_unicode_string_constant;",
"SELECT N'růžový' AS pink_in_czech_unicode_string_constant;",
];
foreach($constant_tests as $t) {
fwrite(STDERR, "Running query '$t'...\n");
var_dump($db->query($t, \PDO::FETCH_ASSOC)->fetchAll());
}
Resulted in this output:
Running query 'SELECT CAST(0x72006f017e016f007600fd00 AS nvarchar(10)) AS pink_in_czech_binary_encoded_utf16;'...
array(1) {
[0]=>
array(1) {
["pink_in_czech_binary_encoded_utf16"]=>
string(9) "růžový"
}
}
Running query 'SELECT CAST(0x6b26 AS nvarchar(3)) AS Beamed_Eighth_Notes_binary_encoded_utf16;'...
array(1) {
[0]=>
array(1) {
["Beamed_Eighth_Notes_binary_encoded_utf16"]=>
string(3) "♫"
}
}
Running query 'SELECT NCHAR(0x266b) AS Beamed_Eighth_Notes_nchar;'...
array(1) {
[0]=>
array(1) {
["Beamed_Eighth_Notes_nchar"]=>
string(3) "▒▒"
}
}
Running query 'SELECT N'♫' AS Beamed_Eighth_Notes_unicode_string_constant;'...
array(1) {
[0]=>
array(1) {
["Beamed_Eighth_Notes_unicode_string_constant"]=>
string(3) "▒▒"
}
}
Running query 'SELECT N'růžový' AS pink_in_czech_unicode_string_constant;'...
array(1) {
[0]=>
array(1) {
["pink_in_czech_unicode_string_constant"]=>
string(9) "růžo"
}
}
But I expected this output instead:
Running query 'SELECT CAST(0x72006f017e016f007600fd00 AS nvarchar(10)) AS pink_in_czech_binary_encoded_utf16;'...
array(1) {
[0]=>
array(1) {
["pink_in_czech_binary_encoded_utf16"]=>
string(9) "růžový"
}
}
Running query 'SELECT CAST(0x6b26 AS nvarchar(3)) AS Beamed_Eighth_Notes_binary_encoded_utf16;'...
array(1) {
[0]=>
array(1) {
["Beamed_Eighth_Notes_binary_encoded_utf16"]=>
string(3) "♫"
}
}
Running query 'SELECT NCHAR(0x266b) AS Beamed_Eighth_Notes_nchar;'...
array(1) {
[0]=>
array(1) {
["Beamed_Eighth_Notes_nchar"]=>
string(3) "♫"
}
}
Running query 'SELECT N'♫' AS Beamed_Eighth_Notes_unicode_string_constant;'...
array(1) {
[0]=>
array(1) {
["Beamed_Eighth_Notes_unicode_string_constant"]=>
string(3) "♫"
}
}
Running query 'SELECT N'růžový' AS pink_in_czech_unicode_string_constant;'...
array(1) {
[0]=>
array(1) {
["pink_in_czech_unicode_string_constant"]=>
string(9) "růžový"
}
}
PHP Version
PHP 8.1.7
Operating System
Debian GNU/Linux testing/bookworm/unstable
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne damit, das Problem mit dem bereitgestellten PHP-Skript, PDO::query() und fetchAll() über PDO_ODBC mit FreeTDS 1.3.6 und SQL Server 2016 zu reproduzieren. Vergleiche die zurückgegebenen Werte für NCHAR und N-präfixierte String-Konstanten mit den erwarteten Unicode-Strings; fertig ist die Aufgabe, wenn alle aufgeführten Abfragen die erwarteten Zeichen ohne Beschädigung zurückgeben.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- php, sql
- Bereich
- databases
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100