mssql, nette 2.4, špatné ukládání diakritiky – hm, asi vyřešeno

kotel
Člen | 3
+
0
-

Zdravím, řeším špatné ukládání několika znaků do databáze. Konkrétně ěčřů. Znaky se uloží bez háčku a čárky. Když už tam jsou, tak se zobrazí správně, takže v charsetu problém nevidím, protože ať jsem nastavil jakýkoli na php i na sloupcích databáze, tak je to pořád stejné. Přičemž je jedno, jestli text přečtu z jiné databáze a hned ukládám do druhé nebo vkládám z formuláře.

mám 3 instance webu, 2xubuntu 18.04 + nginx, 1× windows 10 + apache – xampp instalátor, všude se to chová stejně
mssql 2017 na ubuntu 18.04
nette 2.4
php 7.3
driver: sqlsrv (což je pdo_sqlsrv)

toto nefunguje:

$az->lastname = "ěščřžýáíéů";
$this->database_dochazka->table('zamestnanci')->where('userid', $dz->userid)->update([
                                'lastname' => $az->lastname,
                            ]);

//uloží: ešcržýáíéu

toto je standardní řešení, co jsem našel a funguje:

$this->database_dochazka->query("UPDATE zamestnanci SET lastname = N'ěščřžýáíéů' WHERE userid = ?",$dz->userid);

toto nějakou záhadou také funguje:

$az->lastname = "ěščřžýáíéů";
$this->database_dochazka->table('zamestnanci')->where('userid', $dz->userid)->update([
                                'lastname' => $az->lastname." ",
                            ]);

EDIT:
Již jsem vyřešil, tak možná to někomu pomůže. Přidal jsem „N“ (forcne to uložení jako unicode) do quote funkce pro stringy – upravením Database rozšíření v souboru vendor\nette\database\src\DatabaseSqlPreprocesor.php

Není to elegantní a chtělo by to udělat funkci pro každý driver zvlášť podle vzoru „formatBool“ kvůli rychlosti zpracování. Případně uvítám nějaká jiná řešení.

	private function formatValue($value, $mode = null)
	{
		if (!$mode || $mode === 'auto') {
			if (is_string($value)) {
				if (strlen($value) > 20 || strpos($value, '\\') !== false) {
					$this->remaining[] = $value;
					return '?';

				} else {
				    if((new \ReflectionClass($this->driver))->getShortName()=="SqlsrvDriver")
					    return "N".$this->connection->quote($value);
				    else
return $this->connection->quote($value);
				}

Editoval kotel (3. 2. 2019 3:09)