1. Check existence of mb_string, mysql and xml extensions before installation.
[openemr.git] / phpmyadmin / libraries / mysql_charsets.lib.php
blob39049aec4d5d36230a0534e33b36d1f3f48b8d16
1 <?php
2 /* vim: set expandtab sw=4 ts=4 sts=4: */
3 /**
4 * Shared code for mysql charsets
6 * @package PhpMyAdmin
7 */
8 if (! defined('PHPMYADMIN')) {
9 exit;
12 /**
13 * Generate charset dropdown box
15 * @param int $type Type
16 * @param string $name Element name
17 * @param string $id Element id
18 * @param null|string $default Default value
19 * @param bool $label Label
20 * @param bool $submitOnChange Submit on change
22 * @return string
24 function PMA_generateCharsetDropdownBox($type = PMA_CSDROPDOWN_COLLATION,
25 $name = null, $id = null, $default = null, $label = true,
26 $submitOnChange = false
27 ) {
28 global $mysql_charsets, $mysql_charsets_descriptions,
29 $mysql_charsets_available, $mysql_collations, $mysql_collations_available;
31 if (empty($name)) {
32 if ($type == PMA_CSDROPDOWN_COLLATION) {
33 $name = 'collation';
34 } else {
35 $name = 'character_set';
39 $return_str = '<select lang="en" dir="ltr" name="'
40 . htmlspecialchars($name) . '"'
41 . (empty($id) ? '' : ' id="' . htmlspecialchars($id) . '"')
42 . ($submitOnChange ? ' class="autosubmit"' : '') . '>' . "\n";
43 if ($label) {
44 $return_str .= '<option value="">'
45 . ($type == PMA_CSDROPDOWN_COLLATION ? __('Collation') : __('Charset'))
46 . '</option>' . "\n";
48 $return_str .= '<option value=""></option>' . "\n";
49 foreach ($mysql_charsets as $current_charset) {
50 if (!$mysql_charsets_available[$current_charset]) {
51 continue;
53 $current_cs_descr
54 = empty($mysql_charsets_descriptions[$current_charset])
55 ? $current_charset
56 : $mysql_charsets_descriptions[$current_charset];
58 if ($type == PMA_CSDROPDOWN_COLLATION) {
59 $return_str .= '<optgroup label="' . $current_charset
60 . '" title="' . $current_cs_descr . '">' . "\n";
61 foreach ($mysql_collations[$current_charset] as $current_collation) {
62 if (!$mysql_collations_available[$current_collation]) {
63 continue;
65 $return_str .= '<option value="' . $current_collation
66 . '" title="' . PMA_getCollationDescr($current_collation) . '"'
67 . ($default == $current_collation ? ' selected="selected"' : '')
68 . '>'
69 . $current_collation . '</option>' . "\n";
71 $return_str .= '</optgroup>' . "\n";
72 } else {
73 $return_str .= '<option value="' . $current_charset
74 . '" title="' . $current_cs_descr . '"'
75 . ($default == $current_charset ? ' selected="selected"' : '') . '>'
76 . $current_charset . '</option>' . "\n";
79 $return_str .= '</select>' . "\n";
81 return $return_str;
84 /**
85 * Generate the charset query part
87 * @param string $collation Collation
88 * @param boolean optional $override force 'CHARACTER SET' keyword
90 * @return string
92 function PMA_generateCharsetQueryPart($collation, $override = false)
94 if (!PMA_DRIZZLE) {
95 list($charset) = explode('_', $collation);
96 $keyword = ' CHARSET=';
98 if ($override) {
99 $keyword = ' CHARACTER SET ';
101 return $keyword . $charset
102 . ($charset == $collation ? '' : ' COLLATE ' . $collation);
103 } else {
104 return ' COLLATE ' . $collation;
109 * returns collation of given db
111 * @param string $db name of db
113 * @return string collation of $db
115 function PMA_getDbCollation($db)
117 if ($GLOBALS['dbi']->isSystemSchema($db)) {
118 // We don't have to check the collation of the virtual
119 // information_schema database: We know it!
120 return 'utf8_general_ci';
123 if (! $GLOBALS['cfg']['Server']['DisableIS']) {
124 // this is slow with thousands of databases
125 $sql = PMA_DRIZZLE
126 ? 'SELECT DEFAULT_COLLATION_NAME FROM data_dictionary.SCHEMAS'
127 . ' WHERE SCHEMA_NAME = \'' . PMA_Util::sqlAddSlashes($db)
128 . '\' LIMIT 1'
129 : 'SELECT DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA'
130 . ' WHERE SCHEMA_NAME = \'' . PMA_Util::sqlAddSlashes($db)
131 . '\' LIMIT 1';
132 return $GLOBALS['dbi']->fetchValue($sql);
133 } else {
134 $GLOBALS['dbi']->selectDb($db);
135 $return = $GLOBALS['dbi']->fetchValue('SELECT @@collation_database');
136 if ($db !== $GLOBALS['db']) {
137 $GLOBALS['dbi']->selectDb($GLOBALS['db']);
139 return $return;
144 * returns default server collation from show variables
146 * @return string $server_collation
148 function PMA_getServerCollation()
150 return $GLOBALS['dbi']->fetchValue('SELECT @@collation_server');
154 * returns description for given collation
156 * @param string $collation MySQL collation string
158 * @return string collation description
160 function PMA_getCollationDescr($collation)
162 if ($collation == 'binary') {
163 return __('Binary');
165 $parts = explode('_', $collation);
166 if (count($parts) == 1) {
167 $parts[1] = 'general';
168 } elseif ($parts[1] == 'ci' || $parts[1] == 'cs') {
169 $parts[2] = $parts[1];
170 $parts[1] = 'general';
172 $descr = '';
173 switch ($parts[1]) {
174 case 'bulgarian':
175 $descr = __('Bulgarian');
176 break;
177 case 'chinese':
178 if ($parts[0] == 'gb2312' || $parts[0] == 'gbk') {
179 $descr = __('Simplified Chinese');
180 } elseif ($parts[0] == 'big5') {
181 $descr = __('Traditional Chinese');
183 break;
184 case 'ci':
185 $descr = __('case-insensitive');
186 break;
187 case 'cs':
188 $descr = __('case-sensitive');
189 break;
190 case 'croatian':
191 $descr = __('Croatian');
192 break;
193 case 'czech':
194 $descr = __('Czech');
195 break;
196 case 'danish':
197 $descr = __('Danish');
198 break;
199 case 'english':
200 $descr = __('English');
201 break;
202 case 'esperanto':
203 $descr = __('Esperanto');
204 break;
205 case 'estonian':
206 $descr = __('Estonian');
207 break;
208 case 'german1':
209 $descr = __('German') . ' (' . __('dictionary') . ')';
210 break;
211 case 'german2':
212 $descr = __('German') . ' (' . __('phone book') . ')';
213 break;
214 case 'hungarian':
215 $descr = __('Hungarian');
216 break;
217 case 'icelandic':
218 $descr = __('Icelandic');
219 break;
220 case 'japanese':
221 $descr = __('Japanese');
222 break;
223 case 'latvian':
224 $descr = __('Latvian');
225 break;
226 case 'lithuanian':
227 $descr = __('Lithuanian');
228 break;
229 case 'korean':
230 $descr = __('Korean');
231 break;
232 case 'persian':
233 $descr = __('Persian');
234 break;
235 case 'polish':
236 $descr = __('Polish');
237 break;
238 case 'roman':
239 $descr = __('West European');
240 break;
241 case 'romanian':
242 $descr = __('Romanian');
243 break;
244 case 'sinhala':
245 $descr = __('Sinhalese');
246 break;
247 case 'slovak':
248 $descr = __('Slovak');
249 break;
250 case 'slovenian':
251 $descr = __('Slovenian');
252 break;
253 case 'spanish':
254 $descr = __('Spanish');
255 break;
256 case 'spanish2':
257 $descr = __('Traditional Spanish');
258 break;
259 case 'swedish':
260 $descr = __('Swedish');
261 break;
262 case 'thai':
263 $descr = __('Thai');
264 break;
265 case 'turkish':
266 $descr = __('Turkish');
267 break;
268 case 'ukrainian':
269 $descr = __('Ukrainian');
270 break;
271 case 'unicode':
272 $descr = __('Unicode') . ' (' . __('multilingual') . ')';
273 break;
274 case 'vietnamese':
275 $descr = __('Vietnamese');
276 break;
277 /** @noinspection PhpMissingBreakStatementInspection */
278 case 'bin':
279 $is_bin = true;
280 // no break; statement here, continuing with 'general' section:
281 case 'general':
282 switch ($parts[0]) {
283 // Unicode charsets
284 case 'ucs2':
285 case 'utf8':
286 case 'utf8mb4':
287 $descr = __('Unicode') . ' (' . __('multilingual') . ')';
288 break;
289 // West European charsets
290 case 'ascii':
291 case 'cp850':
292 case 'dec8':
293 case 'hp8':
294 case 'latin1':
295 case 'macroman':
296 $descr = __('West European') . ' (' . __('multilingual') . ')';
297 break;
298 // Central European charsets
299 case 'cp1250':
300 case 'cp852':
301 case 'latin2':
302 case 'macce':
303 $descr = __('Central European') . ' (' . __('multilingual') . ')';
304 break;
305 // Russian charsets
306 case 'cp866':
307 case 'koi8r':
308 $descr = __('Russian');
309 break;
310 // Simplified Chinese charsets
311 case 'gb2312':
312 case 'gbk':
313 $descr = __('Simplified Chinese');
314 break;
315 // Japanese charsets
316 case 'sjis':
317 case 'ujis':
318 case 'cp932':
319 case 'eucjpms':
320 $descr = __('Japanese');
321 break;
322 // Baltic charsets
323 case 'cp1257':
324 case 'latin7':
325 $descr = __('Baltic') . ' (' . __('multilingual') . ')';
326 break;
327 // Other
328 case 'armscii8':
329 case 'armscii':
330 $descr = __('Armenian');
331 break;
332 case 'big5':
333 $descr = __('Traditional Chinese');
334 break;
335 case 'cp1251':
336 $descr = __('Cyrillic') . ' (' . __('multilingual') . ')';
337 break;
338 case 'cp1256':
339 $descr = __('Arabic');
340 break;
341 case 'euckr':
342 $descr = __('Korean');
343 break;
344 case 'hebrew':
345 $descr = __('Hebrew');
346 break;
347 case 'geostd8':
348 $descr = __('Georgian');
349 break;
350 case 'greek':
351 $descr = __('Greek');
352 break;
353 case 'keybcs2':
354 $descr = __('Czech-Slovak');
355 break;
356 case 'koi8u':
357 $descr = __('Ukrainian');
358 break;
359 case 'latin5':
360 $descr = __('Turkish');
361 break;
362 case 'swe7':
363 $descr = __('Swedish');
364 break;
365 case 'tis620':
366 $descr = __('Thai');
367 break;
368 default:
369 $descr = __('unknown');
370 break;
372 if (!empty($is_bin)) {
373 $descr .= ', ' . __('Binary');
375 break;
376 default: $descr = __('unknown');
378 if (!empty($parts[2])) {
379 if ($parts[2] == 'ci') {
380 $descr .= ', ' . __('case-insensitive');
381 } elseif ($parts[2] == 'cs') {
382 $descr .= ', ' . __('case-sensitive');
386 return $descr;