mysql_charsets.lib.php 10 KB

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