Skip to content

Commit c55138d

Browse files
committed
Set charset for TD
1 parent 18533b1 commit c55138d

2 files changed

Lines changed: 33 additions & 7 deletions

File tree

src/Definition/Teradata.php

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,6 @@ class Teradata extends Common
131131
const DEFAULT_NON_LATIN_CLOB_LENGTH = '999M';
132132
const DEFAULT_SECOND_PRECISION_LENGTH = 6;
133133
const DEFAULT_VALUE_TO_SECOND_PRECISION_LENGTH = '4,6';
134-
135134
// types where length isnt at the end of the type
136135
const COMPLEX_LENGTH_DICT = [
137136
self::TYPE_TIME_WITH_ZONE => 'TIME (%d) WITH TIME ZONE',
@@ -194,6 +193,21 @@ class Teradata extends Common
194193
self::TYPE_INTERVAL_SECOND,
195194

196195
];
196+
197+
// types where CHARAET can be defined
198+
const CHARACTER_SET_TYPES = [
199+
self::TYPE_CHAR,
200+
self::TYPE_VARCHAR,
201+
self::TYPE_CLOB,
202+
203+
self::TYPE_CHAR,
204+
self::TYPE_CHARV,
205+
self::TYPE_CHARACTERV,
206+
self::TYPE_VARGRAPHIC,
207+
self::TYPE_LONG_VARCHAR,
208+
self::TYPE_LONG_VARGRAPHIC,
209+
self::TYPE_CHARACTER_LARGE_OBJECT,
210+
];
197211
//https://docs.teradata.com/r/rgAb27O_xRmMVc_aQq2VGw/6CYL2QcAvXykzEc8mG__Xg
198212
const CODE_TO_TYPE = [
199213
'I8' => self::TYPE_BIGINT,
@@ -290,12 +304,13 @@ class Teradata extends Common
290304

291305
/** @var bool */
292306
private $isLatin = false;
307+
293308
// depends on Char Type column in HELP TABLE column
294309
// 1 latin, 2 unicode, 3 kanjiSJIS, 4 graphic, 5 graphic, 0 others
295310

296311
/**
297312
* @param string $type
298-
* @param array $options -- length, nullable, default
313+
* @param array $options -- length, nullable, default
299314
* @throws InvalidLengthException
300315
* @throws InvalidOptionException
301316
* @throws InvalidTypeException
@@ -329,7 +344,6 @@ public static function convertCodeToType($code)
329344
return self::CODE_TO_TYPE[$code];
330345
}
331346

332-
333347
/**
334348
* @return string
335349
*/
@@ -356,6 +370,11 @@ public function getSQLDefinition()
356370
if ($this->getDefault() !== null) {
357371
$definition .= ' DEFAULT ' . $this->getDefault();
358372
}
373+
374+
if (in_array($this->getType(), self::CHARACTER_SET_TYPES, true)) {
375+
$definition .= ' CHARACTER SET ' . ($this->isLatin() ? 'LATIN' : 'UNICODE');
376+
}
377+
359378
return $definition;
360379
}
361380

@@ -395,7 +414,7 @@ private function getDefaultLength()
395414
case self::TYPE_DECIMAL:
396415
case self::TYPE_NUMERIC:
397416
case self::TYPE_DEC:
398-
// number
417+
// number
399418
case self::TYPE_NUMBER:
400419
$out = self::DEFAULT_DECIMAL_LENGTH;
401420
break;
@@ -458,7 +477,6 @@ private function getDefaultLength()
458477
return $out;
459478
}
460479

461-
462480
/**
463481
* @return array
464482
*/
@@ -484,7 +502,7 @@ private function validateType($type)
484502
}
485503

486504
/**
487-
* @param string $type
505+
* @param string $type
488506
* @param string|null $length
489507
* @return void
490508
* @throws InvalidLengthException

tests/TeradataDatatypeTest.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,15 @@ public function testInvalidType()
104104
public function testSqlDefinition($type, $options, $expectedDefinition)
105105
{
106106
$definition = new Teradata($type, $options);
107-
self::assertEquals($expectedDefinition, $definition->getSQLDefinition());
107+
$suffix = in_array($type, Teradata::CHARACTER_SET_TYPES) ? " CHARACTER SET UNICODE" : '';
108+
self::assertEquals($expectedDefinition . $suffix, $definition->getSQLDefinition());
109+
}
110+
111+
112+
public function testSqlDefinitionWhenLatin()
113+
{
114+
$definition = new Teradata("VARCHAR", ['isLatin' => true]);
115+
self::assertEquals('VARCHAR (64000) CHARACTER SET LATIN', $definition->getSQLDefinition());
108116
}
109117

110118
public function expectedSqlDefinitions()

0 commit comments

Comments
 (0)