mysql_charsets.lib.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. <?php
  2. /* vim: set expandtab sw=4 ts=4 sts=4: */
  3. /**
  4. *
  5. * @package PhpMyAdmin
  6. */
  7. if (! defined('PHPMYADMIN')) {
  8. exit;
  9. }
  10. /**
  11. *
  12. */
  13. if (! PMA_Util::cacheExists('mysql_charsets', true)) {
  14. global $mysql_charsets, $mysql_charsets_descriptions,
  15. $mysql_charsets_available, $mysql_collations, $mysql_collations_available,
  16. $mysql_default_collations, $mysql_collations_flat;
  17. $sql = PMA_DRIZZLE
  18. ? 'SELECT * FROM data_dictionary.CHARACTER_SETS'
  19. : 'SELECT * FROM information_schema.CHARACTER_SETS';
  20. $res = PMA_DBI_query($sql);
  21. $mysql_charsets = array();
  22. while ($row = PMA_DBI_fetch_assoc($res)) {
  23. $mysql_charsets[] = $row['CHARACTER_SET_NAME'];
  24. // never used
  25. //$mysql_charsets_maxlen[$row['Charset']] = $row['Maxlen'];
  26. $mysql_charsets_descriptions[$row['CHARACTER_SET_NAME']]
  27. = $row['DESCRIPTION'];
  28. }
  29. PMA_DBI_free_result($res);
  30. sort($mysql_charsets, SORT_STRING);
  31. $mysql_collations = array_flip($mysql_charsets);
  32. $mysql_default_collations = $mysql_collations_flat
  33. = $mysql_charsets_available = $mysql_collations_available = array();
  34. $sql = PMA_DRIZZLE
  35. ? 'SELECT * FROM data_dictionary.COLLATIONS'
  36. : 'SELECT * FROM information_schema.COLLATIONS';
  37. $res = PMA_DBI_query($sql);
  38. while ($row = PMA_DBI_fetch_assoc($res)) {
  39. if (! is_array($mysql_collations[$row['CHARACTER_SET_NAME']])) {
  40. $mysql_collations[$row['CHARACTER_SET_NAME']]
  41. = array($row['COLLATION_NAME']);
  42. } else {
  43. $mysql_collations[$row['CHARACTER_SET_NAME']][] = $row['COLLATION_NAME'];
  44. }
  45. $mysql_collations_flat[] = $row['COLLATION_NAME'];
  46. if ($row['IS_DEFAULT'] == 'Yes' || $row['IS_DEFAULT'] == '1') {
  47. $mysql_default_collations[$row['CHARACTER_SET_NAME']]
  48. = $row['COLLATION_NAME'];
  49. }
  50. //$mysql_collations_available[$row['Collation']]
  51. // = ! isset($row['Compiled']) || $row['Compiled'] == 'Yes';
  52. $mysql_collations_available[$row['COLLATION_NAME']] = true;
  53. $mysql_charsets_available[$row['CHARACTER_SET_NAME']]
  54. = !empty($mysql_charsets_available[$row['CHARACTER_SET_NAME']])
  55. || !empty($mysql_collations_available[$row['COLLATION_NAME']]);
  56. }
  57. PMA_DBI_free_result($res);
  58. unset($res, $row);
  59. if (PMA_DRIZZLE
  60. && isset($mysql_collations['utf8_general_ci'])
  61. && isset($mysql_collations['utf8'])
  62. ) {
  63. $mysql_collations['utf8'] = $mysql_collations['utf8_general_ci'];
  64. $mysql_default_collations['utf8']
  65. = $mysql_default_collations['utf8_general_ci'];
  66. $mysql_charsets_available['utf8']
  67. = $mysql_charsets_available['utf8_general_ci'];
  68. unset(
  69. $mysql_collations['utf8_general_ci'],
  70. $mysql_default_collations['utf8_general_ci'],
  71. $mysql_charsets_available['utf8_general_ci']
  72. );
  73. }
  74. sort($mysql_collations_flat, SORT_STRING);
  75. foreach ($mysql_collations AS $key => $value) {
  76. sort($mysql_collations[$key], SORT_STRING);
  77. reset($mysql_collations[$key]);
  78. }
  79. unset($key, $value);
  80. PMA_Util::cacheSet('mysql_charsets', $GLOBALS['mysql_charsets'], true);
  81. PMA_Util::cacheSet('mysql_charsets_descriptions', $GLOBALS['mysql_charsets_descriptions'], true);
  82. PMA_Util::cacheSet('mysql_charsets_available', $GLOBALS['mysql_charsets_available'], true);
  83. PMA_Util::cacheSet('mysql_collations', $GLOBALS['mysql_collations'], true);
  84. PMA_Util::cacheSet('mysql_default_collations', $GLOBALS['mysql_default_collations'], true);
  85. PMA_Util::cacheSet('mysql_collations_flat', $GLOBALS['mysql_collations_flat'], true);
  86. PMA_Util::cacheSet('mysql_collations_available', $GLOBALS['mysql_collations_available'], true);
  87. } else {
  88. $GLOBALS['mysql_charsets'] = PMA_Util::cacheGet('mysql_charsets', true);
  89. $GLOBALS['mysql_charsets_descriptions'] = PMA_Util::cacheGet('mysql_charsets_descriptions', true);
  90. $GLOBALS['mysql_charsets_available'] = PMA_Util::cacheGet('mysql_charsets_available', true);
  91. $GLOBALS['mysql_collations'] = PMA_Util::cacheGet('mysql_collations', true);
  92. $GLOBALS['mysql_default_collations'] = PMA_Util::cacheGet('mysql_default_collations', true);
  93. $GLOBALS['mysql_collations_flat'] = PMA_Util::cacheGet('mysql_collations_flat', true);
  94. $GLOBALS['mysql_collations_available'] = PMA_Util::cacheGet('mysql_collations_available', true);
  95. }
  96. define('PMA_CSDROPDOWN_COLLATION', 0);
  97. define('PMA_CSDROPDOWN_CHARSET', 1);
  98. function PMA_generateCharsetDropdownBox($type = PMA_CSDROPDOWN_COLLATION,
  99. $name = null, $id = null, $default = null, $label = true, $indent = 0,
  100. $submitOnChange = false, $displayUnavailable = false
  101. ) {
  102. global $mysql_charsets, $mysql_charsets_descriptions,
  103. $mysql_charsets_available, $mysql_collations, $mysql_collations_available;
  104. if (empty($name)) {
  105. if ($type == PMA_CSDROPDOWN_COLLATION) {
  106. $name = 'collation';
  107. } else {
  108. $name = 'character_set';
  109. }
  110. }
  111. $return_str = '<select lang="en" dir="ltr" name="'
  112. . htmlspecialchars($name) . '"'
  113. . (empty($id) ? '' : ' id="' . htmlspecialchars($id) . '"')
  114. . ($submitOnChange ? ' class="autosubmit"' : '') . '>' . "\n";
  115. if ($label) {
  116. $return_str .= '<option value="">'
  117. . ($type == PMA_CSDROPDOWN_COLLATION ? __('Collation') : __('Charset'))
  118. . '</option>' . "\n";
  119. }
  120. $return_str .= '<option value=""></option>' . "\n";
  121. foreach ($mysql_charsets as $current_charset) {
  122. if (!$mysql_charsets_available[$current_charset]) {
  123. continue;
  124. }
  125. $current_cs_descr
  126. = empty($mysql_charsets_descriptions[$current_charset])
  127. ? $current_charset
  128. : $mysql_charsets_descriptions[$current_charset];
  129. if ($type == PMA_CSDROPDOWN_COLLATION) {
  130. $return_str .= '<optgroup label="' . $current_charset
  131. . '" title="' . $current_cs_descr . '">' . "\n";
  132. foreach ($mysql_collations[$current_charset] as $current_collation) {
  133. if (!$mysql_collations_available[$current_collation]) {
  134. continue;
  135. }
  136. $return_str .= '<option value="' . $current_collation
  137. . '" title="' . PMA_getCollationDescr($current_collation) . '"'
  138. . ($default == $current_collation ? ' selected="selected"' : '')
  139. . '>'
  140. . $current_collation . '</option>' . "\n";
  141. }
  142. $return_str .= '</optgroup>' . "\n";
  143. } else {
  144. $return_str .= '<option value="' . $current_charset
  145. . '" title="' . $current_cs_descr . '"'
  146. . ($default == $current_charset ? ' selected="selected"' : '') . '>'
  147. . $current_charset . '</option>' . "\n";
  148. }
  149. }
  150. $return_str .= '</select>' . "\n";
  151. return $return_str;
  152. }
  153. function PMA_generateCharsetQueryPart($collation)
  154. {
  155. if (!PMA_DRIZZLE) {
  156. list($charset) = explode('_', $collation);
  157. return ' CHARACTER SET ' . $charset
  158. . ($charset == $collation ? '' : ' COLLATE ' . $collation);
  159. } else {
  160. return ' COLLATE ' . $collation;
  161. }
  162. }
  163. /**
  164. * returns collation of given db
  165. *
  166. * @param string $db name of db
  167. *
  168. * @return string collation of $db
  169. */
  170. function PMA_getDbCollation($db)
  171. {
  172. if (PMA_is_system_schema($db)) {
  173. // We don't have to check the collation of the virtual
  174. // information_schema database: We know it!
  175. return 'utf8_general_ci';
  176. }
  177. if (! $GLOBALS['cfg']['Server']['DisableIS']) {
  178. // this is slow with thousands of databases
  179. $sql = PMA_DRIZZLE
  180. ? 'SELECT DEFAULT_COLLATION_NAME FROM data_dictionary.SCHEMAS'
  181. . ' WHERE SCHEMA_NAME = \'' . PMA_Util::sqlAddSlashes($db)
  182. . '\' LIMIT 1'
  183. : 'SELECT DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA'
  184. . ' WHERE SCHEMA_NAME = \'' . PMA_Util::sqlAddSlashes($db)
  185. . '\' LIMIT 1';
  186. return PMA_DBI_fetch_value($sql);
  187. } else {
  188. PMA_DBI_select_db($db);
  189. $return = PMA_DBI_fetch_value(
  190. 'SHOW VARIABLES LIKE \'collation_database\'', 0, 1
  191. );
  192. if ($db !== $GLOBALS['db']) {
  193. PMA_DBI_select_db($GLOBALS['db']);
  194. }
  195. return $return;
  196. }
  197. }
  198. /**
  199. * returns default server collation from show variables
  200. *
  201. * @return string $server_collation
  202. */
  203. function PMA_getServerCollation()
  204. {
  205. return PMA_DBI_fetch_value(
  206. 'SHOW VARIABLES LIKE \'collation_server\'', 0, 1
  207. );
  208. }
  209. /**
  210. * returns description for given collation
  211. *
  212. * @param string $collation MySQL collation string
  213. *
  214. * @return string collation description
  215. */
  216. function PMA_getCollationDescr($collation)
  217. {
  218. if ($collation == 'binary') {
  219. return __('Binary');
  220. }
  221. $parts = explode('_', $collation);
  222. if (count($parts) == 1) {
  223. $parts[1] = 'general';
  224. } elseif ($parts[1] == 'ci' || $parts[1] == 'cs') {
  225. $parts[2] = $parts[1];
  226. $parts[1] = 'general';
  227. }
  228. $descr = '';
  229. switch ($parts[1]) {
  230. case 'bulgarian':
  231. $descr = __('Bulgarian');
  232. break;
  233. case 'chinese':
  234. if ($parts[0] == 'gb2312' || $parts[0] == 'gbk') {
  235. $descr = __('Simplified Chinese');
  236. } elseif ($parts[0] == 'big5') {
  237. $descr = __('Traditional Chinese');
  238. }
  239. break;
  240. case 'ci':
  241. $descr = __('case-insensitive');
  242. break;
  243. case 'cs':
  244. $descr = __('case-sensitive');
  245. break;
  246. case 'croatian':
  247. $descr = __('Croatian');
  248. break;
  249. case 'czech':
  250. $descr = __('Czech');
  251. break;
  252. case 'danish':
  253. $descr = __('Danish');
  254. break;
  255. case 'english':
  256. $descr = __('English');
  257. break;
  258. case 'esperanto':
  259. $descr = __('Esperanto');
  260. break;
  261. case 'estonian':
  262. $descr = __('Estonian');
  263. break;
  264. case 'german1':
  265. $descr = __('German') . ' (' . __('dictionary') . ')';
  266. break;
  267. case 'german2':
  268. $descr = __('German') . ' (' . __('phone book') . ')';
  269. break;
  270. case 'hungarian':
  271. $descr = __('Hungarian');
  272. break;
  273. case 'icelandic':
  274. $descr = __('Icelandic');
  275. break;
  276. case 'japanese':
  277. $descr = __('Japanese');
  278. break;
  279. case 'latvian':
  280. $descr = __('Latvian');
  281. break;
  282. case 'lithuanian':
  283. $descr = __('Lithuanian');
  284. break;
  285. case 'korean':
  286. $descr = __('Korean');
  287. break;
  288. case 'persian':
  289. $descr = __('Persian');
  290. break;
  291. case 'polish':
  292. $descr = __('Polish');
  293. break;
  294. case 'roman':
  295. $descr = __('West European');
  296. break;
  297. case 'romanian':
  298. $descr = __('Romanian');
  299. break;
  300. case 'slovak':
  301. $descr = __('Slovak');
  302. break;
  303. case 'slovenian':
  304. $descr = __('Slovenian');
  305. break;
  306. case 'spanish':
  307. $descr = __('Spanish');
  308. break;
  309. case 'spanish2':
  310. $descr = __('Traditional Spanish');
  311. break;
  312. case 'swedish':
  313. $descr = __('Swedish');
  314. break;
  315. case 'thai':
  316. $descr = __('Thai');
  317. break;
  318. case 'turkish':
  319. $descr = __('Turkish');
  320. break;
  321. case 'ukrainian':
  322. $descr = __('Ukrainian');
  323. break;
  324. case 'unicode':
  325. $descr = __('Unicode') . ' (' . __('multilingual') . ')';
  326. break;
  327. case 'bin':
  328. $is_bin = true;
  329. case 'general':
  330. switch ($parts[0]) {
  331. // Unicode charsets
  332. case 'ucs2':
  333. case 'utf8':
  334. $descr = __('Unicode') . ' (' . __('multilingual') . ')';
  335. break;
  336. // West European charsets
  337. case 'ascii':
  338. case 'cp850':
  339. case 'dec8':
  340. case 'hp8':
  341. case 'latin1':
  342. case 'macroman':
  343. $descr = __('West European') . ' (' . __('multilingual') . ')';
  344. break;
  345. // Central European charsets
  346. case 'cp1250':
  347. case 'cp852':
  348. case 'latin2':
  349. case 'macce':
  350. $descr = __('Central European') . ' (' . __('multilingual') . ')';
  351. break;
  352. // Russian charsets
  353. case 'cp866':
  354. case 'koi8r':
  355. $descr = __('Russian');
  356. break;
  357. // Simplified Chinese charsets
  358. case 'gb2312':
  359. case 'gbk':
  360. $descr = __('Simplified Chinese');
  361. break;
  362. // Japanese charsets
  363. case 'sjis':
  364. case 'ujis':
  365. case 'cp932':
  366. case 'eucjpms':
  367. $descr = __('Japanese');
  368. break;
  369. // Baltic charsets
  370. case 'cp1257':
  371. case 'latin7':
  372. $descr = __('Baltic') . ' (' . __('multilingual') . ')';
  373. break;
  374. // Other
  375. case 'armscii8':
  376. case 'armscii':
  377. $descr = __('Armenian');
  378. break;
  379. case 'big5':
  380. $descr = __('Traditional Chinese');
  381. break;
  382. case 'cp1251':
  383. $descr = __('Cyrillic') . ' (' . __('multilingual') . ')';
  384. break;
  385. case 'cp1256':
  386. $descr = __('Arabic');
  387. break;
  388. case 'euckr':
  389. $descr = __('Korean');
  390. break;
  391. case 'hebrew':
  392. $descr = __('Hebrew');
  393. break;
  394. case 'geostd8':
  395. $descr = __('Georgian');
  396. break;
  397. case 'greek':
  398. $descr = __('Greek');
  399. break;
  400. case 'keybcs2':
  401. $descr = __('Czech-Slovak');
  402. break;
  403. case 'koi8u':
  404. $descr = __('Ukrainian');
  405. break;
  406. case 'latin5':
  407. $descr = __('Turkish');
  408. break;
  409. case 'swe7':
  410. $descr = __('Swedish');
  411. break;
  412. case 'tis620':
  413. $descr = __('Thai');
  414. break;
  415. default:
  416. $descr = __('unknown');
  417. break;
  418. }
  419. if (!empty($is_bin)) {
  420. $descr .= ', ' . __('Binary');
  421. }
  422. break;
  423. default: $descr = __('unknown');
  424. }
  425. if (!empty($parts[2])) {
  426. if ($parts[2] == 'ci') {
  427. $descr .= ', ' . __('case-insensitive');
  428. } elseif ($parts[2] == 'cs') {
  429. $descr .= ', ' . __('case-sensitive');
  430. }
  431. }
  432. return $descr;
  433. }
  434. ?>