@@ -300,12 +300,35 @@ static char *pdo_mysql_last_insert_id(pdo_dbh_t *dbh, const char *name, size_t *
300
300
static int mysql_handle_quoter (pdo_dbh_t * dbh , const char * unquoted , size_t unquotedlen , char * * quoted , size_t * quotedlen , enum pdo_param_type paramtype )
301
301
{
302
302
pdo_mysql_db_handle * H = (pdo_mysql_db_handle * )dbh -> driver_data ;
303
+ zend_bool use_national_character_set = 0 ;
304
+
305
+ if (H -> assume_national_character_set_strings ) {
306
+ use_national_character_set = 1 ;
307
+ }
308
+ if ((paramtype & PDO_PARAM_STR_NATL ) == PDO_PARAM_STR_NATL ) {
309
+ use_national_character_set = 1 ;
310
+ }
311
+ if ((paramtype & PDO_PARAM_STR_CHAR ) == PDO_PARAM_STR_CHAR ) {
312
+ use_national_character_set = 0 ;
313
+ }
314
+
303
315
PDO_DBG_ENTER ("mysql_handle_quoter" );
304
316
PDO_DBG_INF_FMT ("dbh=%p" , dbh );
305
317
PDO_DBG_INF_FMT ("unquoted=%.*s" , (int )unquotedlen , unquoted );
306
- * quoted = safe_emalloc (2 , unquotedlen , 3 );
307
- * quotedlen = mysql_real_escape_string (H -> server , * quoted + 1 , unquoted , unquotedlen );
308
- (* quoted )[0 ] = (* quoted )[++ * quotedlen ] = '\'' ;
318
+ * quoted = safe_emalloc (2 , unquotedlen , 3 + (use_national_character_set ? 1 : 0 ));
319
+
320
+ if (use_national_character_set ) {
321
+ * quotedlen = mysql_real_escape_string (H -> server , * quoted + 2 , unquoted , unquotedlen );
322
+ (* quoted )[0 ] = 'N' ;
323
+ (* quoted )[1 ] = '\'' ;
324
+
325
+ ++ * quotedlen ; /* N prefix */
326
+ } else {
327
+ * quotedlen = mysql_real_escape_string (H -> server , * quoted + 1 , unquoted , unquotedlen );
328
+ (* quoted )[0 ] = '\'' ;
329
+ }
330
+
331
+ (* quoted )[++ * quotedlen ] = '\'' ;
309
332
(* quoted )[++ * quotedlen ] = '\0' ;
310
333
PDO_DBG_INF_FMT ("quoted=%.*s" , (int )* quotedlen , * quoted );
311
334
PDO_DBG_RETURN (1 );
@@ -369,7 +392,7 @@ static inline int mysql_handle_autocommit(pdo_dbh_t *dbh)
369
392
static int pdo_mysql_set_attribute (pdo_dbh_t * dbh , zend_long attr , zval * val )
370
393
{
371
394
zend_long lval = zval_get_long (val );
372
- zend_bool bval = lval ? 1 : 0 ;
395
+ zend_bool bval = lval ? 1 : 0 ;
373
396
PDO_DBG_ENTER ("pdo_mysql_set_attribute" );
374
397
PDO_DBG_INF_FMT ("dbh=%p" , dbh );
375
398
PDO_DBG_INF_FMT ("attr=%l" , attr );
@@ -382,18 +405,25 @@ static int pdo_mysql_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val)
382
405
}
383
406
PDO_DBG_RETURN (1 );
384
407
408
+ case PDO_ATTR_DEFAULT_STR_PARAM :
409
+ ((pdo_mysql_db_handle * )dbh -> driver_data )-> assume_national_character_set_strings = lval == PDO_PARAM_STR_NATL ? 1 : 0 ;
410
+ PDO_DBG_RETURN (1 );
411
+
385
412
case PDO_MYSQL_ATTR_USE_BUFFERED_QUERY :
386
413
/* ignore if the new value equals the old one */
387
414
((pdo_mysql_db_handle * )dbh -> driver_data )-> buffered = bval ;
388
415
PDO_DBG_RETURN (1 );
416
+
389
417
case PDO_MYSQL_ATTR_DIRECT_QUERY :
390
418
case PDO_ATTR_EMULATE_PREPARES :
391
419
/* ignore if the new value equals the old one */
392
420
((pdo_mysql_db_handle * )dbh -> driver_data )-> emulate_prepare = bval ;
393
421
PDO_DBG_RETURN (1 );
422
+
394
423
case PDO_ATTR_FETCH_TABLE_NAMES :
395
424
((pdo_mysql_db_handle * )dbh -> driver_data )-> fetch_table_names = bval ;
396
425
PDO_DBG_RETURN (1 );
426
+
397
427
#ifndef PDO_USE_MYSQLND
398
428
case PDO_MYSQL_ATTR_MAX_BUFFER_SIZE :
399
429
if (lval < 0 ) {
@@ -450,10 +480,15 @@ static int pdo_mysql_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_
450
480
}
451
481
}
452
482
break ;
483
+
453
484
case PDO_ATTR_AUTOCOMMIT :
454
485
ZVAL_LONG (return_value , dbh -> auto_commit );
455
486
break ;
456
487
488
+ case PDO_ATTR_DEFAULT_STR_PARAM :
489
+ ZVAL_LONG (return_value , H -> assume_national_character_set_strings ? PDO_PARAM_STR_NATL : PDO_PARAM_STR_CHAR );
490
+ break ;
491
+
457
492
case PDO_MYSQL_ATTR_USE_BUFFERED_QUERY :
458
493
ZVAL_LONG (return_value , H -> buffered );
459
494
break ;
@@ -597,6 +632,7 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options)
597
632
H -> max_buffer_size = 1024 * 1024 ;
598
633
#endif
599
634
635
+ H -> assume_national_character_set_strings = 0 ;
600
636
H -> buffered = H -> emulate_prepare = 1 ;
601
637
602
638
/* handle MySQL options */
@@ -616,6 +652,9 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options)
616
652
H -> emulate_prepare = pdo_attr_lval (driver_options ,
617
653
PDO_ATTR_EMULATE_PREPARES , H -> emulate_prepare );
618
654
655
+ H -> assume_national_character_set_strings = pdo_attr_lval (driver_options ,
656
+ PDO_ATTR_DEFAULT_STR_PARAM , 0 ) == PDO_PARAM_STR_NATL ? 1 : 0 ;
657
+
619
658
#ifndef PDO_USE_MYSQLND
620
659
H -> max_buffer_size = pdo_attr_lval (driver_options , PDO_MYSQL_ATTR_MAX_BUFFER_SIZE , H -> max_buffer_size );
621
660
#endif
0 commit comments