php / php/php-src

unicode string corruption when using PDO_ODBC with FreeTDS 1.3.6 and MS SQL Server 2016

Aperta
#9,498 10 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Bug Extension: pdo_odbc Status: Needs Triage
Lingua principale
C
Stelle
40.4k
Fork
8.1k
Merge medio
2g 13h
PR unite (30g)
96

Descrizione

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

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia riproducendo il problema con lo script PHP fornito, PDO::query() e fetchAll() tramite PDO_ODBC con FreeTDS 1.3.6 e SQL Server 2016. Confronta i valori restituiti per NCHAR e le costanti stringa con prefisso N con le stringhe Unicode attese; il lavoro è completato quando tutte le query elencate restituiscono i caratteri attesi senza corruzione.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
php, sql
Ambito
databases
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.